TODO の例を変更して、最初の React/Relay アプリケーションを作成しています。パラメータ bookCount を持つオブジェクト Distributor に独自のミューテーションを追加するところまで来ました。このミューテーションは AddBook と呼ばれ、単純に書籍の数を 1 増やします。この時点で、ミューテーションはエラーなく実行され、楽観的に bookCount を正しく 1 増やしますが、サーバーからの応答を受け取ると、モデルの変更を元に戻します。これは、サーバーからの応答に、指定した出力フィールドが不思議なことに含まれていないためだと思います。
これが私の突然変異です:
var GraphQLAddBookMutation = mutationWithClientMutationId({
name: 'AddBook',
inputFields: {
},
outputFields: {
distributor: {
type: GraphQlDistributor,
resolve: () => getDistributor(),
},
},
mutateAndGetPayload: () => {
console.log("Trying to mutate.");
addBook();
return {};
},
});
outputFields に「distributor」フィールドが含まれていますが、graphql 応答には「distributor」データが含まれていません。
Graphql の応答は次のとおりです。
{
"data": {
"addBook": {
"clientMutationId": "0"
}
}
}
mutateAndGetPayload 関数は呼び出されるが、ディストリビューター解決関数は呼び出されないことを確認しました。
outputFields のすべてのフィールドが graphql 応答に含まれ、outputFields 内のすべての解決関数が呼び出されて、応答に適切なパラメーターが入力されることを期待していましたが、そうではありません
生成された schema.json には、AddBookPayload で指定した outputFields が含まれているため、これは特に混乱を招きます。
{
"kind": "OBJECT",
"name": "AddBookPayload",
"description": null,
"fields": [
{
"name": "distributor",
"description": null,
"args": [],
"type": {
"kind": "OBJECT",
"name": "Distributor",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "clientMutationId",
"description": null,
"args": [],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "String",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
}
],
"inputFields": null,
"interfaces": [],
"enumValues": null,
"possibleTypes": null
},