【问题标题】:How to resolve nested types in GraphQL?如何解析 GraphQL 中的嵌套类型?
【发布时间】:2017-12-18 10:06:03
【问题描述】:

我在解析 graphql 嵌套类型时遇到问题。我可以成功触发UserMetrics 嵌套解析器,但父解析器对象(用户)为空。我是否误解了 GraphQL 解析器映射?

架构:

type User {
    id: String!
    metrics: UserMetrics
}

type UserMetrics {
    lastLogin: String!
}

解析器:

Query: {
    user(_, { id }, ctx) {
        return { id }; 
    }
},

User: {
    metrics(): ({}), // UserMetrics.lastLogin doesn't fire without this
},

UserMetrics: {
    lastLogin(user) {
        console.log(user); // null
    }
},

【问题讨论】:

  • 另外,您提供的示例中有一个错字。 metrics() => ({}), 会抛出语法错误

标签: javascript graphql


【解决方案1】:

这可能会让您有点困惑,不幸的是,文档没有提供嵌套类型如何工作的可靠示例。根据文档,解析器采用的第一个参数是:

包含从解析器返回的结果的对象 父字段

因此,父(用户)解析某个字段(指标)。 如果这个字段是一个标量,它不需要做任何其他事情,这就是返回的内容。 否则父解析的值将传递给与“子”类型(UserMetrics)关联的解析器。然后,每个解析器都使用该值来解析它负责的字段。

在您提供的代码中,Usermetrics 解析为空对象(即 {})。这是为 UserMetrics 中的任何字段传递给解析器的值。严格来说,在这种情况下,在该值上运行 console.log 将返回 {},而不是 null。

试试这个:注释掉metrics 字段的解析器,而不是{ id },让您的查询返回{ id, metrics: { lastLogin: 'foo' }}。运行它,您应该会看到一个控制台输出,其中显示了传递给lastLogin 解析器的对象,在本例中为{ lastLogin: 'foo' }

一步一步,这里发生了什么:

  1. 查询的 user 字段解析为 { id: 'whateverIdYouProvided', metrics: { lastLogin: 'foo' }}。由于它返回的是 User 类型,而不是标量,因此它将这个值向下传递给 User 中任何字段的解析器。
  2. id 这样的字段在这种情况下没有指定解析器,因此它使用默认解析器。这只是查看它收到的对象,如果找到与其字段名称匹配的属性,它会解析为该属性的值。如果找不到该名称的任何属性,则返回 null。在这种情况下,id 是一个标量,因此它只解析为 'whateverIdYouProvided',无需进一步说明。
  3. 因为我们注释掉了metrics 解析器,该字段也将使用默认解析器。在这种情况下,它解析为一个类型 (UserMetrics),因此它查看给定的对象,找到一个名为 metrics 的属性并将该值(即 { lastLogin: 'foo' })传递给 UserMetrics 中字段的任何解析器。李>
  4. UserMetrics 有一个名为 lastLogin 的字段。它的解析器接收到上面的值——{ lastLogin: 'foo' }——来使用。如果您没有在此处指定解析器,则将再次使用默认解析器,它会很高兴地找到一个名为 lastLogin 的属性并解析为它的值('foo')。如果您提供自定义解析器,就像您所做的那样,显然它将解析为您返回的任何内容(对于您的代码,为 null)。

如果lastLogin 解析器根本没有被调用,请确认您确实在查询中包含了该字段!查询中未包含的任何字段都不需要解析,因此不会调用它们的解析器。

【讨论】:

  • 然后传递查询结果以连接嵌套类型的解析器是一种常见的模式吗?所以上面的metrics: obj => obj 将通过id 向下传递UserMetrics.lastLogin
猜你喜欢
  • 2018-08-25
  • 2019-12-14
  • 2019-06-18
  • 2021-07-28
  • 2019-08-15
  • 2018-12-22
  • 2018-08-05
  • 2017-08-13
  • 2019-10-14
相关资源
最近更新 更多