如何解析 GraphQL 中的嵌套类型?
Posted
技术标签:
【中文标题】如何解析 GraphQL 中的嵌套类型?【英文标题】:How to resolve nested types in 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() => (),
会抛出语法错误
【参考方案1】:
这可能会让您有点困惑,不幸的是,文档没有提供嵌套类型如何工作的可靠示例。根据文档,解析器采用的第一个参数是:
包含从解析器返回的结果的对象 父字段
因此,父(用户)解析某个字段(指标)。 如果这个字段是一个标量,它不需要做任何其他事情,这就是返回的内容。 否则父解析的值将传递给与“子”类型(UserMetrics)关联的解析器。然后,每个解析器都使用该值来解析它负责的字段。
在您提供的代码中,User
将 metrics
解析为空对象(即 )。这是为 UserMetrics 中的任何字段传递给解析器的值。严格来说,在这种情况下,在该值上运行 console.log 将返回 ,而不是 null。
试试这个:注释掉metrics
字段的解析器,而不是 id
,让您的查询返回 id, metrics: lastLogin: 'foo'
。运行它,您应该会看到一个控制台输出,其中显示了传递给lastLogin
解析器的对象,在本例中为 lastLogin: 'foo'
。
一步一步,这里发生了什么:
-
查询的
user
字段解析为 id: 'whateverIdYouProvided', metrics: lastLogin: 'foo' 。由于它返回的是 User
类型,而不是标量,因此它将这个值向下传递给 User
中任何字段的解析器。
像id
这样的字段在这种情况下没有指定解析器,因此它使用默认解析器。这只是查看它收到的对象,如果找到与其字段名称匹配的属性,它会解析为该属性的值。如果找不到该名称的任何属性,则返回 null。在这种情况下,id 是一个标量,因此它只解析为 'whateverIdYouProvided',无需进一步说明。
因为我们注释掉了metrics
解析器,该字段也将使用默认解析器。在这种情况下,它解析为一个类型 (UserMetrics),因此它查看给定的对象,找到一个名为 metrics
的属性并将该值(即 lastLogin: 'foo'
)传递给 UserMetrics 中字段的任何解析器。李>
UserMetrics 有一个名为 lastLogin 的字段。它的解析器接收到上面的值—— lastLogin: 'foo'
——来使用。如果您没有在此处指定解析器,则将再次使用默认解析器,它会很高兴地找到一个名为 lastLogin 的属性并解析为它的值('foo')。如果您提供自定义解析器,就像您所做的那样,显然它将解析为您返回的任何内容(对于您的代码,为 null)。
如果lastLogin
解析器根本没有被调用,请确认您确实在查询中包含了该字段!查询中未包含的任何字段都不需要解析,因此不会调用它们的解析器。
【讨论】:
然后传递查询结果以连接嵌套类型的解析器是一种常见的模式吗?所以上面的metrics: obj => obj
将通过id
向下传递UserMetrics.lastLogin
。以上是关于如何解析 GraphQL 中的嵌套类型?的主要内容,如果未能解决你的问题,请参考以下文章
在 GraphQL 中不能有带有嵌套字段的输入类型。错误:预期类型是 GraphQLInputType,但不是