gpt4 book ai didi

javascript - 如何解析 GraphQL 中的嵌套类型?

转载 作者:数据小太阳 更新时间:2023-10-29 04:31:49 29 4
gpt4 key购买 nike

我在解析 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
}
},

最佳答案

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

The object that contains the result returned from the resolver on the parent field

所以,父(User)解析了某个字段(metrics)。 如果这个字段是一个标量,它不需要做任何其他事情,这就是返回的内容。 否则 父解析的值将传递给与“子”类型 (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 解析器根本没有被调用,请确认您确实在查询中包含了该字段!查询中未包含的任何字段都不需要解析,因此不会调用它们的解析器。

关于javascript - 如何解析 GraphQL 中的嵌套类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45083756/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com