GraphQL显示Value为null

时间:2018-10-20 12:49:18

标签: node.js graphql

我正在学习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

请有人帮我弄清楚我在做什么错吗?

1 个答案:

答案 0 :(得分:2)

解析器必须返回某个值或将以一个值解析的Promise-如果不是,则解析的字段将返回null。因此,您的代码有两件事。第一,您既不返回值也不返回Promise。第二,您在回调中返回了一些东西,但是实际上并没有做任何事情,因为大多数库无论如何都会忽略回调函数的返回值。

您可以wrap a callback in a Promise,但这在这里将是过大的,因为猫鼬已经提供了一种返回Promise的方法-只需完全省略回调即可。

resolve(parent, args) {
  return Author.findOne({name: parent.authorName)
}

您的突变解析器之所以起作用,是因为您返回了通过调用save()返回的值,而实际上返回了一个Promise,该Promise将解析为要保存的模型实例的值。