[英]Deep query to nested types in GraphQL return NULL
有一個奇怪的問題...
查詢嵌套類型返回null。
但是,如果我返回父類型的任何內容,請返回正確的結果
我的代碼:
import { GraphQLList, GraphQLString, GraphQLID, GraphQLObjectType, GraphQLSchema } from 'graphql';
import AdminModel from '../models/Admin.model';
const AdminType = new GraphQLObjectType({
name: 'AdminType',
fields: {
_id: { type: GraphQLID },
login: { type: GraphQLString },
password: { type: GraphQLString }
}
});
const AdminRooteType = new GraphQLObjectType({
name: 'AdminRooteType',
fields: {
getAdmins: {
type: new GraphQLList(AdminType),
resolve() {
return AdminModel.find({})
}
}
}
})
export default new GraphQLSchema({
query: new GraphQLObjectType({
name: 'RootQuery',
fields: {
admin: {
type: AdminRooteType,
resolve() {
// EMPTY RESOLVE - EMPTY RESULT
}
}
}
})
});
查詢:
{
admin {
getAdmins {
login
}
}
}
結果:
{
"data": {
"admin": null
}
}
如果我在RootQuery的admin字段中更改了返回值:
import { GraphQLList, GraphQLString, GraphQLID, GraphQLObjectType, GraphQLSchema } from 'graphql';
import AdminModel from '../models/Admin.model';
const AdminType = new GraphQLObjectType({
name: 'AdminType',
fields: {
_id: { type: GraphQLID },
login: { type: GraphQLString },
password: { type: GraphQLString }
}
});
const AdminRooteType = new GraphQLObjectType({
name: 'AdminRooteType',
fields: {
getAdmins: {
type: new GraphQLList(AdminType),
resolve() {
return AdminModel.find({})
}
}
}
})
export default new GraphQLSchema({
query: new GraphQLObjectType({
name: 'RootQuery',
fields: {
admin: {
type: AdminRooteType,
#resolve() {#
#// RETURN ANYTHING HERE:#
# return 'foobar'#
}
}
}
})
});
我有預期的結果:
{
"data": {
"admin": {
"getAdmins": [
{
"login": "123"
},
{
"login": "12asdf3"
}
]
}
}
}
什么是解決此問題的正確方法? (不使用虛擬值作為回報)
非常感謝!
您所看到的是預期的行為。 假設我們有一個User
類型,其中包含一些字段:
const UserType = new GraphQLObjectType({
name: 'User',
fields: {
id: { type: GraphQLID },
name: { type: GraphQLString },
}
})
還有一種獲取單個用戶的方法:
const QueryType = new GraphQLObjectType({
name: 'Query',
fields: {
user: {
type: AdminRooteType,
resolve: () => getUser(),
},
},
})
如果getUser
返回表示User
的對象,則將調用所有字段的解析程序(即, User
類型上的id
和name
。
當這些字段(以及它們可能具有的任何子字段)解析后,您將得到一個User對象,整個user
字段都將返回。 響應可能類似於:
"data": {
"user": {
"id": 1,
"name": "Maria",
"comments": [
{
"id": 1,
// and so on...
}
]
}
}
現在,考慮當找不到用戶而我們返回null時會發生什么。 我們的回應如下:
"data": {
"user": null
}
為“用戶”字段調用任何解析程序都沒有道理。 在這種情況下,您是否希望API仍返回id
或name
? 如果這樣做的話,這些字段將具有什么值? 如果我們只是返回一個空的id
和name
,客戶端將如何將該對象與一個已存在但確實具有id
和name
null值的用戶區分開?
關鍵是,如果字段返回GraphQLObjectType且解析為null,則不會調用GraphQLObjectType上的任何解析器。
通過不必要地將getAdmins
字段嵌套在另一個GraphQLObjectType中,您被迫在解析器中返回admin
某種對象。 因此,您將需要忍受這一點,或者避免完全創建AdminRootType
而只需按照getAdmins
將getAdmins
字段直接放在查詢類型上:
const QueryType = new GraphQLObjectType({
name: 'Query',
fields: {
getAdmins: {
type: new GraphQLList(AdminType),
resolve: () => AdminModel.find({}),
},
},
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.