GraphQL将args传递给子解析

时间:2016-09-27 18:49:18

标签: graphql graphql-js

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

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帖子的resolve函数中的args是空对象,我如何将args从主查询传递给子解析函数?

2 个答案:

答案 0 :(得分:6)

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

示例:



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();
      }
    }
  })
});




答案 1 :(得分:0)

您可以使用解析器fouth参数 info 从Apollo文档中接收所需的变量:

  

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

     

fieldName(obj,args,上下文,信息)    {结果}

     

这些参数有   以下含义和常规名称:

     

obj :包含解析器返回的结果的对象   父字段,或者,对于顶级查询字段,   从服务器配置传递的rootValue。此参数启用   GraphQL查询的嵌套性质。

     

参数:带有   参数传递到查询的字段中。例如,如果   字段使用author(name:“ Ada”)进行调用,则args对象为:{   “ name”:“ Ada”}。

     

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

     

信息:此参数只能是   在高级情况下使用,但其中包含有关   查询的执行状态,包括字段名称,   根源领域等等。它仅记录在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();
      }
    }
  })
});