【问题标题】:How to define parameters/arguments to a list resolver?如何为列表解析器定义参数/参数?
【发布时间】:2018-06-16 20:06:30
【问题描述】:

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

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参数。关于可能导致此错误的原因以及如何解决它的任何建议?

【问题讨论】:

    标签: graphql-js


    【解决方案1】:

    当您使用buildSchema 时,您实际上无法为架构中的给定字段定义自定义解析器。相反,将始终使用默认解析器。默认解析器只需获取给定字段的“父”或“根”对象,在该父对象上查找与该字段同名的属性并返回其值。

    您可以通过将根对象与您的架构一起传递来“摆脱”这种更简单的架构。然后,此根对象成为默认解析器引用的父对象,但用于顶级字段(如您为 Query 类型定义的每个字段)。因此,在这种情况下,当 GraphQL 解析您的查询时,默认解析器会看到父对象上的 posts 属性并将其返回。因为posts实际上是一个函数,它先调用函数,然后返回值,但是它调用它的参数与调用解析器的参数不同

    解析器接收四个参数——1)“根”或“父”值、2)参数、3)上下文和 4)包含有关请求的附加数据的“信息”对象。默认解析器调用的任何函数都只会获取最后 3 个参数(因此没有“根”值)。

    换句话说,您应该将根对象更改为如下所示:

    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

    【讨论】:

      猜你喜欢
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 2020-09-14
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多