如果我有两种类型:User
和Note
,其模式如下:
query {
getUser(userId: ID!): User
}
type User {
userId: ID
email: String
notes: [Note]
}
type Note {
noteId: ID
text: String
}
我正在为User#notes
编写一个解析器。现在假设需要通过电子邮件地址检索备注,所以我实际上需要传递给解析器的根对象包含email
字段,我是否可以强制GraphQL查询User
对象中的email
字段,即使用户没有请求它?
在代码方面,通过我所看到的,我可以编写解析器。当用户请求obj.email
字段时,如何确保note
被请求?
User: {
notes(obj, args, context, info) {
// How can I ensure obj.email is requested?
return NoteRetriever.getNotesByEmail(obj.email);
}
}
编辑
我想知道父解析器除非显式请求否则不会解析email
字段的情况。如果我们需要调用API来获取用户的电子邮件,该怎么办?因此,在默认情况下,我们不请求它。然而,当要求的笔记,它是有意义的要求电子邮件。
解析器是否有一种方法可以指定父字段的依赖项--以确保被请求?
发布于 2019-04-01 06:38:11
我认为,如果您控制父类的查询,并期望子元素中的值,则应该确保所需的值始终由父级解析。
但是,在合并架构时,有一种方法可以完成您所要求的操作。https://www.apollographql.com/docs/graphql-tools/schema-stitching在这里对此进行了描述。
基本上,需要有一个基本模式,类似于
type Query {
getUser(userId: ID!): User
}
type User {
userId: ID
email: String
}
具有与现在相同的解析器和第二个模式,类似于
type Note {
noteId: ID
text: String
}
extend type User {
notes: [Note]
}
还有类似的东西
import { mergeSchemas } from 'graphql-tools';
const finalSchema = mergeSchemas({
schemas: [userSchema, noteSchema],
resolvers: {
User {
notes: {
fragment: '... on User { email }',
resolve: notesResolver
}
}
}
});
console.dir(await graphql(finalSchema, `query { ... }`));
请注意定义电子邮件字段的片段属性。在上面的链接中,它描述了当此子字段被解析时,它将如何将给定字段强制解析到父域上。
发布于 2019-03-25 08:28:18
作为第一个参数传递给解析器的“父”值正是父字段解析器中返回的值(除非返回了承诺,在这种情况下,它将是解析的承诺)。因此,如果我们有这样一个解析器:
Query: {
getUser: () => {
return {
userId: 10,
email: 'user@example.com',
foobar: 42,
}
}
}
以及这样的查询:
query {
getUser {
id
notes
}
}
传递给我们的notes
解析器的是我们在getUser
解析器中返回的整个对象。
User: {
notes(obj, args, context, info) {
console.log(obj.userId) // 10
console.log(obj.email) // "user@example.com"
console.log(obj.foobar) // 42
}
}
父值将与请求的字段相同,除非父字段解析器的逻辑根据请求的字段实际返回不同的值。这意味着您还可以将任意数量的其他任意条目(如上面的foobar
)从父字段传递给每个子字段。
编辑:
字段是相互独立地解析的,因此没有在字段之间声明依赖关系的机制。如果getUser
解析器正在查看所请求的字段,并根据请求的字段进行特定的API调用(如果未请求这些字段,则忽略其他字段),则需要修改该逻辑,以说明需要user
电子邮件的notes
字段。
https://stackoverflow.com/questions/55341979
复制相似问题