我正在尝试在GraphQL中包装REST API,但我遇到了这个问题。想象一下,我有以下类型:
const CbookType = new GraphQLObjectType({
name: 'CbookType',
fields: () => ({
id: { type: GraphQLID },
title: { type: GraphQLString },
user: {
type: UserType,
args: {
userToken: { type: new GraphQLNonNull(GraphQLString) },
userId: { type: new GraphQLNonNull(GraphQLString) }
},
resolve(parentValue, { userToken, userId }) {
return UserController.user({ targetUserId: parentValue.user_id, userToken, userId });
}
}
});
用户字段位于另一个REST端点上,所以我必须再次传递我的令牌和user_id,这会创建丑陋的查询,我必须永久地为我的令牌和user_id添加args。
我有没有办法让我的RootQuery中传递args并在我的类型中重用它们?我调查了parentValue,但他们不在那里。
答案 0 :(得分:1)
传递给解析器(parentValue)的第一个参数就是" parent"解析的字段 - 它不包含有关请求本身或值如何解析的任何信息。
因为GraphQL解析了每个"级别"在继续之前,您可以在更高级别修改传递给每个解析器(第三个参数)的上下文,并且更改将对较低级别的所有解析器可见。
例如,获取Foo类型的查询的解析器:
function (obj, { userToken, userId }, ctx = {}) => {
Object.assign(ctx, { userToken, userId })
return getFoo()
}
然后Foo类型的字段可能如下所示:
function (obj, { userToken, userId }, ctx = {}) => {
return getBars(ctx.userToken, ctx.userId)
}