web-dev-qa-db-ja.com

GraphQLは引数をサブ解決に渡します

ユーザーと投稿の関係があります。これは私がユーザー投稿を照会する方法です。

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投稿の解決関数の引数が空のオブジェクトであるということです。メインクエリからサブ解決関数に引数を渡すにはどうすればよいですか?

13
user6889738

ルートクエリを解決するときに、オブジェクト割り当てを使用して、返されたユーザーオブジェクトに引数を付加できます。次に、ユーザータイプで、ルート値(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();
      }
    }
  })
});
7
HagaiCo

リゾルバーのfouth引数infoを使用して、Apollodocsから目的の変数を受け取ることができます。

GraphQL.jsスキーマのすべてのリゾルバーは、次の4つの位置引数を受け入れます。

fieldName(obj、args、context、info){result}

これらの引数には、次の意味と従来の名前があります。

obj:親フィールドのリゾルバーから返された結果を含むオブジェクト、または最上位のクエリフィールドの場合は、サーバー構成から渡されたrootValue。この引数は、GraphQLクエリのネストされた性質を有効にします。

args:クエリのフィールドに渡された引数を持つオブジェクト。たとえば、フィールドがauthor(name: "Ada")で呼び出された場合、argsオブジェクトは次のようになります:{"name": "Ada"}。

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