遇到一个奇怪的问题。。。
对嵌套类型的查询返回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
}
为User字段调用任何解析器都没有意义。在这种情况下,您希望API仍然返回id
或name
吗?如果是,这些字段会有什么值?如果我们只是返回一个空的id
和name
,那么客户端将如何将该对象与存在但确实具有id
和name
空值的用户区分开来?
关键是,如果字段返回GraphQLObjectType并解析为null,则不会调用GraphQLObjectType上的任何解析器。
通过不必要地将getAdmins
字段嵌套在另一个GraphQLObjectType中,您将被迫在admin
的解析器中返回某种对象。因此,您需要接受这一点,或者完全避免创建AdminRootType
,只需按照约定将getAdmins
字段直接放在查询类型上:
const QueryType = new GraphQLObjectType({
name: 'Query',
fields: {
getAdmins: {
type: new GraphQLList(AdminType),
resolve: () => AdminModel.find({}),
},
},
})