如何解析 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)关联的解析器。然后,每个解析器都使用该值来解析它负责的字段。

在您提供的代码中,Usermetrics 解析为空对象(即 )。这是为 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 查询中的嵌套项

对 GraphQL 中嵌套类型的深度查询返回 NULL

“graphql-tools”中的嵌套解析器不起作用

在 GraphQL 中不能有带有嵌套字段的输入类型。错误:预期类型是 GraphQLInputType,但不是

嵌套错误:无法确定 getProducts 的 GraphQL 输出类型

具有多个嵌套解析器并将字段映射到参数的 GraphQL 查询