如何定义列表解析器的参数/参数?

时间:2018-06-16 04:03:06

标签: graphql-js

我有这个架构和相应的解析器:

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参数。有关可能导致此错误的原因以及解决方法的建议吗?

1 个答案:

答案 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