次の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",
「ネストされた」リゾルバーを作成するには、親フィールドの戻り値の型にリゾルバーを定義するだけです。この場合、authorQueries
フィールドはタイプauthorQueries
を返すため、リゾルバーをそこに配置できます。
{
Query: { authorQueries: () => ({}) },
authorQueries: {
author(root, args) {
return "Hello, world!";
}
}
}
したがって、技術的な意味では、ネストされたリゾルバなどはありません。すべてのオブジェクトタイプにはフィールドのフラットリストがあり、それらのフィールドには戻り値のタイプがあります。 GraphQLクエリのネストにより、結果がネストされます。
親フィールドの戻り値型で関数を返すと、結果として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