我用过express-graphql
,在那里我曾经做过类似的事情。
const SubCategoryType = new ObjectType({
name: 'SubCategory',
fields: () => ({
id: { type: IDType },
name: { type: StringType },
category: {
type: CategoryType,
resolve: parentValue => getCategoryBySubCategory(parentValue.id)
},
products: {
type: List(ProductType),
resolve: parentValue => getProductsBySubCategory(parentValue.id)
}
})
});
这里我有多个解析器,id and name
是直接从结果中获取的。并且类别和产品都有自己的数据库操作。等等。
现在,我正在apollo-server
上工作,我找不到复制它的方法。
例如我有一个类型
type Test {
something: String
yo: String
comment: Comment
}
type Comment {
text: String
createdAt: String
author: User
}
在我的解析器中,我想将其拆分,例如这样的
text: {
something: 'value',
yo: 'value',
comment: getComments();
}
注意:这只是我需要的代表。
答案 0 :(得分:2)
您可以添加特定于类型的解析器来处理特定字段。假设您具有以下架构(基于您的示例):
type Query {
getTest: Test
}
type Test {
id: Int!
something: String
yo: String
comment: Comment
}
type Comment {
id: Int!
text: String
createdAt: String
author: User
}
type User {
id: Int!
name: String
email: String
}
我们还假设您具有以下数据库方法:
getTest()
返回具有字段something
,yo
和
commentId
getComment(id)
返回一个具有字段id
,text
,createdAt
和userId
getUser(id)
返回具有字段id
,name
和email
的对象您的解析器将如下所示:
const resolver = {
// root Query resolver
Query: {
getTest: (root, args, ctx, info) => getTest()
},
// Test resolver
Test: {
// resolves field 'comment' on Test
// the 'parent' arg contains the result from the parent resolver (here, getTest on root)
comment: (parent, args, ctx, info) => getComment(parent.commentId)
},
// Comment resolver
Comment: {
// resolves field 'author' on Comment
// the 'parent' arg contains the result from the parent resolver (here, comment on Test)
author: (parent, args, ctx, info) => getUser(parent.userId)
},
}
希望这会有所帮助。