Я создаю свое первое приложение React/Relay, изменяя пример TODO. Я дошел до того, что добавляю свою собственную мутацию для объекта Distributor, у которого есть параметр bookCount. Мутация называется 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, но данные «дистрибьютора» не включены в ответ graphql.
Ответ графа:
{
"data": {
"addBook": {
"clientMutationId": "0"
}
}
}
Я проверил, что функция mutateAndGetPayload вызывается, но функция разрешения дистрибьютора НЕ вызывается.
Я ожидал, что каждое поле в outputFields будет включено в ответ graphql, и каждая функция разрешения в outputFields будет вызываться для заполнения соответствующих параметров в ответе, но это не так.
Меня это особенно сбивает с толку, потому что сгенерированный schema.json ДЕЙСТВИТЕЛЬНО включает любые поля outputField, которые я указываю в AddBookPayload:
{
"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
},