web-dev-qa-db-ja.com

Apollo GraphQLサーバーでネストされたリゾルバーを作成する方法

次のapolloサーバーのgraphqlスキーマを考えると、これらを別々のモジュールに分解したいので、ルートクエリスキーマの下で作成者クエリを使用したくないので、分離します。ルートクエリに追加する前に、authorQueriesと呼ばれる別のレイヤーを追加しました

type Author {
    id: Int,
    firstName: String,
    lastName: String
}  
type authorQueries {
    author(firstName: String, lastName: String): Author
}

type Query {
    authorQueries: authorQueries
}

schema {
    query: Query
}

以下を試してみました。author関数が指定される前に、authorQueriesが別のレイヤーとして追加されていることがわかります。

Query: {
    authorQueries :{
        author (root, args) {
            return {}
       }
    }
}

Graphiqlでクエリを実行するときに、その追加のレイヤーも追加しました。

{
    authorQueries {
        author(firstName: "Stephen") {
            id
        }
    }
}

次のエラーが発生します。

"message": "Resolve function for \"Query.authorQueries\" returned undefined",

16
elbarto

「ネストされた」リゾルバーを作成するには、親フィールドの戻り値の型にリゾルバーを定義するだけです。この場合、authorQueriesフィールドはタイプauthorQueriesを返すため、リゾルバーをそこに配置できます。

{
  Query: { authorQueries: () => ({}) },
  authorQueries: {
    author(root, args) {
      return "Hello, world!";
    }
  }
}

したがって、技術的な意味では、ネストされたリゾルバなどはありません。すべてのオブジェクトタイプにはフィールドのフラットリストがあり、それらのフィールドには戻り値のタイプがあります。 GraphQLクエリのネストにより、結果がネストされます。

20
stubailo

親フィールドの戻り値型で関数を返すと、結果としてthis引数がバインドされ、最初の引数としてネストされたリゾルバーが親ではなく、リゾルバーインターフェイスが壊れることがわかりました。

インライン型定義の場合

import {
  graphql,
} from 'graphql';

import {
  makeExecutableSchema, IResolverObject
} from 'graphql-tools';

const types = `
type Query {
  person: User
}

type User {
  id: ID
  name: String,
  dog(showCollar: Boolean): Dog
}

type Dog {
  name: String
}
`;

const User: IResolverObject = {
  dog(obj, args, ctx) {
    console.log('Dog Arg 1', obj);
    return {
      name: 'doggy'
    };
  }
};

const resolvers = {
  User,
  Query: {
    person(obj) {
      console.log('Person Arg 1', obj);
      return {
        id: 'foo',
        name: 'bar',
      };
    }
  }
};

const schema = makeExecutableSchema({
  typeDefs: [types],
  resolvers
});

const query = `{ 
  person {
    name,
    dog(showCollar: true) {
      name
    }
  }
 }`;


graphql(schema, query).then(result => {
  console.log(JSON.stringify(result, null, 2));
});

// Person Arg 1 undefined
// Dog Arg 1 { id: 'foo', name: 'bar' }
// {
//   "data": {
//     "person": {
//       "name": "bar",
//       "dog": {
//         "name": "doggy"
//       }
//     }
//   }
// }

以下の要点にあるように、addResolveFunctionsToSchemaを使用することもできます。

https://Gist.github.com/blugavere/4060f4bf2f3d5b741c639977821a254f

1
blugavere