对GraphQL中嵌套类型的深度查询返回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类型上的idname)的解析器

当这些字段(以及它们可能具有的任何子字段)解析后,将返回整个user字段的User对象。一个响应可能看起来像:

"data": {
"user": {
"id": 1,
"name": "Maria",
"comments": [
{
"id": 1,
// and so on...
}
]
}
}

现在,考虑一下当找不到用户而返回null时会发生什么。我们的回复如下:

"data": {
"user": null
}

为User字段调用任何解析器都没有意义。在这种情况下,您希望API仍然返回idname吗?如果是,这些字段会有什么值?如果我们只是返回一个空的idname,那么客户端将如何将该对象与存在但确实具有idname空值的用户区分开来?

关键是,如果字段返回GraphQLObjectType并解析为null,则不会调用GraphQLObjectType上的任何解析器。

通过不必要地将getAdmins字段嵌套在另一个GraphQLObjectType中,您将被迫在admin的解析器中返回某种对象。因此,您需要接受这一点,或者完全避免创建AdminRootType,只需按照约定将getAdmins字段直接放在查询类型上:

const QueryType = new GraphQLObjectType({
name: 'Query',
fields: {
getAdmins: {
type: new GraphQLList(AdminType),
resolve: () => AdminModel.find({}),
},
},
})

最新更新