深查询嵌套类型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管理领域改变返回值:
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
的对象,对于所有的字段相器(即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
空值的用户该对象?
问题是,如果一个字段返回一个GraphQLObjectType,它解析为空,没有对GraphQLObjectType解析器会被调用。
通过嵌套不必要的另一个GraphQLObjectType里面你getAdmins
场,你不得不返回某种对象的解析器内的admin
。所以,你要么需要住在一起,或完全避免创建AdminRootType
而直接把getAdmins
领域上的查询类型,按约定:
const QueryType = new GraphQLObjectType({
name: 'Query',
fields: {
getAdmins: {
type: new GraphQLList(AdminType),
resolve: () => AdminModel.find({}),
},
},
})
深查询嵌套类型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管理领域改变返回值:
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
的对象,对于所有的字段相器(即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
空值的用户该对象?
问题是,如果一个字段返回一个GraphQLObjectType,它解析为空,没有对GraphQLObjectType解析器会被调用。
通过嵌套不必要的另一个GraphQLObjectType里面你getAdmins
场,你不得不返回某种对象的解析器内的admin
。所以,你要么需要住在一起,或完全避免创建AdminRootType
而直接把getAdmins
领域上的查询类型,按约定:
const QueryType = new GraphQLObjectType({
name: 'Query',
fields: {
getAdmins: {
type: new GraphQLList(AdminType),
resolve: () => AdminModel.find({}),
},
},
})