Jam*_*sch 7 javascript graphql
我在解析graphql嵌套类型时遇到问题.我可以成功获取UserMetrics嵌套的解析器,但父解析器对象(用户)为null.我误解了GraphQL解析器映射吗?
架构:
type User {
id: String!
metrics: UserMetrics
}
type UserMetrics {
lastLogin: String!
}
Run Code Online (Sandbox Code Playgroud)
解析器:
Query: {
user(_, { id }, ctx) {
return { id };
}
},
User: {
metrics(): ({}), // UserMetrics.lastLogin doesn't fire without this
},
UserMetrics: {
lastLogin(user) {
console.log(user); // null
}
},
Run Code Online (Sandbox Code Playgroud)
Dan*_*den 12
这可能有点让人困惑,不幸的是,文档没有提供嵌套类型如何工作的可靠示例.根据文档,解析器采用的第一个参数是:
包含从父字段上的解析程序返回的结果的对象
因此,父(用户)解析某个字段(指标).如果此字段是标量,则不需要执行任何其他操作,这就是返回的内容.否则,父解析的值将传递给与"子"类型(UserMetrics)关联的解析器.然后,每个解析器都使用该值来解析它负责的字段.
在您提供的代码中,User将解析metrics为空对象(即{}).这是为UserMetrics中的任何字段传递给解析程序的值.严格地说,在这种情况下,在该值上运行console.log将返回{},而不是null.
试试这个:为该metrics字段注释掉你的解析器,而不是{ id }让你的查询返回{ id, metrics: { lastLogin: 'foo' }}.运行它,您应该看到一个控制台输出,显示传递给解析器的对象lastLogin,在本例中{ lastLogin: 'foo' }.
一步一步,这里发生了什么:
user查询的字段被解析为{ID: 'whateverIdYouProvided',指标{lastLogin: '富'}}.由于它返回的是一个User类型而不是一个标量,它会将此值传递给内部任何字段的解析器User.id在这种情况下没有指定解析器,所以它使用默认的解析器.这只是查看它收到的对象,如果找到与其字段名称匹配的属性,它将解析为该属性的值.如果它找不到该名称的任何属性,则返回null.在这种情况下,id是一个标量,所以它只是解析为'whateverIdYouProvided'并且不需要再进一步了.metrics解析器,所以此字段也将使用默认解析器.在这种情况下,它解析为一个类型(UserMetrics),因此它查看给定的对象,找到一个被调用的属性metrics,并将该值(即{ lastLogin: 'foo' })传递给UserMetrics中字段的任何解析器.{ lastLogin: 'foo' }- 使用.如果你没有在这里指定一个解析器,那么将再次使用默认的解析器,它将很乐意找到一个名为lastLogin的属性并解析它的值('foo').如果您提供自定义解析器,就像您所做的那样,显然它将解析为您返回的任何内容(在您的代码的情况下为null).如果lastLogin根本没有调用解析器,请确认您确实在查询中包含了该字段!不包含在查询中的任何字段都不需要解析,因此不会调用它们的解析器.
| 归档时间: |
|
| 查看次数: |
3980 次 |
| 最近记录: |