#angular #graphql #apollo #apollo-client
#angular #graphql #apollo #apollo-client
Вопрос:
Здесь я столкнулся с очень странной проблемой.
У нас есть поисковый запрос graphql, который принимает фильтры и выдает нам список элементов. Запрос выглядит примерно так
allOpportunityV2(only: String, page: Int, per_page: Int, q: String,
with: String, sort: String, filters: OpportunityFilter): OpportunityList
OpportunityFilter — это объект, имеющий параметры фильтра, такие как
{
duration: RangeInput,
home_mcs: [Int],
programmes: [Int]
}
Когда я делаю этот запрос для определенной комбинации фильтров, apollo отправляет сетевой запрос, даже если он был запрошен ранее, и я получаю правильный ответ на вкладке сеть, но в методе успеха apollo я не получаю правильного ответа.
Предполагаемый результат:
Получите правильный ответ при успешном выполнении запроса
Фактический результат:
{
data: undefined
loading: false
networkStatus: 7
stale: true
}
Это просто происходит случайным образом для некоторой комбинации и довольно непредсказуемо для точного воспроизведения.
Комментарии:
1. У меня та же проблема. Вы нашли какое-либо решение для этого?
Ответ №1:
Как описано здесь https://github.com/apollographql/apollo-client/issues/3030#issuecomment-448472845
После нескольких трасс я понял, что данные всегда равны нулю всякий раз, когда в прогнозируемом результате отсутствуют поля. Например, если мы должны запросить пользователя типа:
user { uuid email picture }
и по какой-то причине сервер не возвращает полеpicture
, то результат будет:
{ data: null loading: false networkStatus: 7 stale: true }
Я также заметил, что мы получим предупреждение об отсутствии изображения поля на консоли.
В моем конкретном случае мой сервер никогда не сериализует
null
значения. Поскольку изображение пользователя и многие другие поля являются необязательными (обнуляемыми), мы постоянно сталкиваемся с этой проблемой.
Это почти всегда проблема с вашим внутренним сервером. Вам придется тщательно сериализовать все в ответе, даже если данные для какого-либо конкретного поля равны нулю. Это решило проблему для нас.