(я столкнулся с этим вопросом, когда столкнулся с аналогичной проблемой, которую я сейчас решил)
В Apollo, когда мутация возвращает данные, которые используются в другом запросе, результаты этого запроса будутбыть обновленным.например, этот запрос, который возвращает все задачи
query {
todos {
id
description
status
}
}
Затем, если мы помечаем задачу как выполненную с мутацией
mutation CompleteTodo {
markCompleted(id: 3) {
todo {
id
status
}
}
}
И результат будет
{
todo: {
id: 3,
status: "completed"
__typename: "Todo"
}
}
Тогда статус элемента todo с идентификатором 1 будет обновлен.Проблема возникает, когда мутация сообщает запросу, что он устарел, но не предоставляет достаточно информации для обновления запроса.например,
query {
todos {
id
description
status
owner {
id
name
}
}
}
и
mutation CompleteTodo {
assignToUser(todoId: 3, userId: 12) {
todo {
id
owner {
id
}
}
}
}
Пример результата:
{
todo: {
id: 3,
owner: {
id: 12,
__typename: "User"
},
__typename: "Todo"
}
}
Представьте, что ваше приложение ранее ничего не знало о пользователе: 12.Вот что происходит
- Кэш для Todo: 3 знает, что у него теперь есть владелец User: 12
- Кэш для пользователя: 12 содержит только
{id:12}
, так как мутация не былаt вернуть поле имени - Запрос не может дать точную информацию для поля имени для владельца без повторного ввода (что не происходит по умолчанию).Он обновляется и возвращает
data: {}
Возможные решения
- Измените запрос на возврат мутации, чтобы включить все поля, необходимые для запроса.
- Запустить повторное получение запроса после мутации (через refetchQueries) или другой запрос, который включает в себя все, что нужно кешу
- обновление кеша вручную
Первый из них, вероятно, самый простой и быстрый.В документации apollo есть некоторые обсуждения этого, но я не вижу ничего, что описывало бы конкретное поведение пустых данных.
https://www.apollographql.com/docs/angular/features/cache-updates.html
Подсказка к @ clément-prévost за его комментарий, который дал подсказку:
Запросы и мутации, которые выбирают одну и ту же сущность, должны запрашивать одни и те же поля.Это способ избежать проблем с локальным кэшем.