GraphQL 将参数传递给子解析

Posted

技术标签:

【中文标题】GraphQL 将参数传递给子解析【英文标题】:GraphQL pass args to sub resolve 【发布时间】:2017-02-05 12:45:45 【问题描述】:

我在用户和帖子之间有关系。这就是我查询用户帖子的方式。

const UserType = new GraphQLObjectType(
  name: 'User'
  fields: () => (
    name: 
      type: GraphQLString
    ,
    posts: 
      type: new GraphQLList(PostType),
      resolve(parent, args ,  db ) 
        // I want to get here the args.someBooleanArg
        return someLogicToGetUserPosts();
      
    
  )
);

主要查询是:

const queryType = new GraphQLObjectType(
  name: 'RootQuery',
  fields: 
    users: 
      type: new GraphQLList(UserType),
      args: 
        id: 
          type: GraphQLInt
        ,
        someBooleanArg: 
          type: GraphQLInt
        
      ,
      resolve: (root,  id, someBooleanArg ,  db ) => 
        return someLogicToGetUsers();
      
    
  
);

问题是 UserType 帖子的解析函数中的 args 是空对象,我如何将主查询中的 args 传递给子解析函数?

【问题讨论】:

【参考方案1】:

解析根查询时,您可以使用 object assign 将参数附加到返回的用户对象。 然后,在用户类型上,从根值(resolve 函数的第一个参数)解析参数。

例子:

const queryType = new GraphQLObjectType(
  name: 'RootQuery',
  fields: 
    users: 
      type: new GraphQLList(UserType),
      args: 
        id: 
          type: GraphQLInt
        ,
        someBooleanArg: 
          type: GraphQLInt
        
      ,
      resolve: (root,  id, someBooleanArg ,  db ) => 
        return Promise.resolve(someLogicToGetUsers()).then(v => 
            return Object.assign(, v, 
                someBooleanArg
            );
        );
      
    
  
);

const UserType = new GraphQLObjectType(
  name: 'User'
  fields: () => (
    name: 
      type: GraphQLString
    ,
    posts: 
      type: new GraphQLList(PostType),
      resolve(parent, args ,  db ) 
        console.log(parent.someBooleanArg);
        return someLogicToGetUserPosts();
      
    
  )
);

【讨论】:

是否没有本地方式将其作为“args”传递给子查询而不是更改响应对象?【参考方案2】:

您可以使用解析器的第四个参数 info 来接收所需的变量 - 来自 Apollo 文档:

GraphQL.js 架构中的每个解析器都接受四个位置参数:

fieldName(obj, args, context, info) 结果

这些论点有 以下含义和常规名称:

obj:包含解析器返回结果的对象 父字段,或者在***查询字段的情况下, 从服务器配置传递的 rootValue。这个论点使 GraphQL 查询的嵌套性质。

args:具有 参数传递到查询中的字段。例如,如果 使用作者(名称:“Ada”)调用字段,args 对象将是: “名称”:“艾达”。

context:这是所有解析器共享的对象 一个特定的查询,用于包含每个请求的状态, 包括身份验证信息、数据加载器实例和 解决问题时应考虑的任何其他事项 询问。如果您使用的是 Apollo Server,请阅读有关如何设置 设置文档中的上下文。

info:这个参数应该只 在高级情况下使用,但它包含有关 查询的执行状态,包括字段名、路径 从根字段,等等。它仅记录在 GraphQL.js 源代码。

info 似乎是一个非常无证的功能,但我现在使用它没有任何问题(至少在有人决定更改它之前)。

这是诀窍:

const UserType = new GraphQLObjectType(
  name: 'User'
  fields: () => (
    name: 
      type: GraphQLString
    ,
    posts: 
      type: new GraphQLList(PostType),
      resolve(parent, args ,  db , info) 
        // I want to get here the args.someBooleanArg

        console.log("BINGO!");
        console.log(info.variableValues.someBooleanArg);

        return someLogicToGetUserPosts();
      
    
  )
);

【讨论】:

这不正确,该字段的args 与您查询的variables 不同。你可以有,例如 ``` query($variableId: ID) user(id: $variableId) posts // 这里你得到信息。 variableValues.variableId,而不是用户 args.id ``` 这只适用于命名的变量,如果你使用硬编码的变量,它们不会出现

以上是关于GraphQL 将参数传递给子解析的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给 GraphQL 中的子属性

GraphQl 将查询参数传递给子类型

Apollo Server:将参数传递给嵌套解析器

如何将参数传递给graphql查询?

将枚举类型作为参数传递给 GraphQL 查询 - Quarkus

使用指令将参数传递给子组件角度