GraphQL:在类型中重用root_query中的参数

时间:2017-11-02 16:26:34

标签: javascript node.js graphql

我正在尝试在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,但他们不在那里。

1 个答案:

答案 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)
}