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

Posted

技术标签:

【中文标题】GraphQL:在类型中重用来自 root_query 的参数【英文标题】:GraphQL : Reuse arguments from root_query in a type 【发布时间】:2018-04-15 06:19:53 【问题描述】:

我正在尝试在 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 中传递的参数并在我的类型中重用它们?我调查了 parentValue 但他们不在那里。

【问题讨论】:

【参考方案1】:

传递给解析器的第一个参数 (parentValue) 只是字段的“父级”解析到的内容——它不会包含有关请求本身或值如何解析的任何信息。

由于 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)

【讨论】:

以上是关于GraphQL:在类型中重用来自 root_query 的参数的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL:如何重用相同的类型进行查询和变异?

如何重用graphql查询中的字段

重用 GraphQL 片段

如何在graphql中重用解析器

如果它们来自数据源,如何在 graphql 模式中表示枚举?

如何使用来自 GraphQL 的模拟数据测试 React 应用程序?