我正在学习GraphQL,并且有两种对象类型。
说,他们看起来像这样
说,这本书的类型如下
const BookType = new GraphQLObjectType({
name: 'Book',
fields: () => ({
id: { type: GraphQLID},
name: { type: GraphQLString},
genre: { type: GraphQLString },
author: {
type: authorType,
resolve(parents, args) {
Author.findOne(
{
name: parents.authorName
}, function(err, result) {
console.log(result)
return result
})
}
}
})
})
作者类型如下
const authorType = new GraphQLObjectType({
name: 'author',
fields: () => ({
id: { type: GraphQLID},
name: { type: GraphQLString},
age: { type: GraphQLInt },
books: {
type: new GraphQLList(BookType),
resolve(parent, args) {
}
}
})
})
现在,我正在通过Mutation添加数据(不共享数据,因为我认为这是不相关的),然后在graphql
中运行查询以在Book Type中添加数据。它可以正确显示名称,流派,ID的数据,但对于authorType,它会在console..log结果日志中将数据显示为null
//This is console log in terminal
{ age: 'none',
_id: 5bcaf8904b31d50a2148b60d,
name: 'George R Martin',
__v: 0 }
这是我在 graphiql
中运行的查询mutation{
addBooks(
name: "Game of Thrones",
genre: "Science Friction",
authorName: "George R Martin"
) {
name,
genre,
author {
name
}
}
}
我的entire schema is available here
请有人帮我弄清楚我在做什么错吗?
答案 0 :(得分:2)
解析器必须返回某个值或将以一个值解析的Promise-如果不是,则解析的字段将返回null。因此,您的代码有两件事。第一,您既不返回值也不返回Promise。第二,您在回调中返回了一些东西,但是实际上并没有做任何事情,因为大多数库无论如何都会忽略回调函数的返回值。
您可以wrap a callback in a Promise,但这在这里将是过大的,因为猫鼬已经提供了一种返回Promise的方法-只需完全省略回调即可。
resolve(parent, args) {
return Author.findOne({name: parent.authorName)
}
您的突变解析器之所以起作用,是因为您返回了通过调用save()
返回的值,而实际上返回了一个Promise,该Promise将解析为要保存的模型实例的值。