【问题标题】:GraphQL pass args to sub resolveGraphQL 将参数传递给子解析
【发布时间】: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 传递给子解析函数?

【问题讨论】:

    标签: graphql graphql-js


    【解决方案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 } } ```
    • 这只适用于命名的变量,如果你使用硬编码的变量,它们不会出现
    猜你喜欢
    • 2022-07-20
    • 2018-12-20
    • 2017-01-02
    • 2018-02-16
    • 2017-08-13
    • 2019-03-01
    • 2016-12-12
    • 2017-09-27
    • 2023-01-26
    相关资源
    最近更新 更多