我有这个架构和相应的解析器:
const schema = buildSchema(
`
type Query {
posts(id: Int): [Post]
}
type Post {
id: Int!,
title: String,
date: String
}`
);
const resolvers = {
posts(root, { id }, context, info) {
console.log(id); // Undefined
return [
{
id: 0,
date: '21/04/2018',
title: 'Post 1'
},
{
id: 1,
date: '07/10/2018',
title: 'Post 2'
}
];
},
Post(postObj) {
return {
id: postObj.id,
title: postObj.title,
date: postObj.date
}
}
}
问题在于,当我查询具有指定ID的帖子时,如下所示:
query {
posts(id: 0) {
title
}
}
...我收到一条错误消息,说我还没有定义这样的参数(id)。
我根据GraphQL Docs定义了id参数。有关可能导致此错误的原因以及解决方法的建议吗?
答案 0 :(得分:0)
使用buildSchema
时,您有效地阻止自己为架构中的给定字段定义自定义解析器。相反,将始终使用默认解析程序。默认的解析器只需要使用" parent"或" root"对于给定字段的对象,在该父对象上查找与该字段同名的属性并返回其值。
你可以逃脱"通过传入根对象和模式,可以实现更简单的模式。然后,此根对象将成为默认解析程序引用的父对象,但对于顶级字段(如您为Query
类型定义的每个字段),仅。因此,在这种情况下,当GraphQL解析您的查询时,默认解析程序会在父对象上看到posts
属性并返回该属性。因为posts
实际上是一个函数,它首先调用函数然后返回值,但它调用它的参数与使用调用解析器的参数不同。
旋转变压器接收四个参数 - 1)" root"或者"父母"值,2)参数,3)上下文和4)"信息"包含有关请求的其他数据的对象。默认解析器调用的任何函数只能获取最后3个参数(因此没有" root" value)。
换句话说,您应该将根对象更改为更像这样:
const root = {
posts({ id }, context, info) {
return [
{
id: 0,
date: '21/04/2018',
title: 'Post 1'
},
{
id: 1,
date: '07/10/2018',
title: 'Post 2'
}
];
},
}
但是,这样做只会让您处理像查询这样的顶级字段。您将无法为其他类型的字段(如Post)自定义解析器行为。为此,您应该使用graphql-tools' makeExecutableSchema
。