Запросы перезаписываются с отсутствующими полями в кеше Apollo

У меня есть ситуация, когда я иногда хочу запросить список из множества объектов с несколькими полями, а иногда только один объект с множеством полей. В качестве примера рассмотрим эти два запроса:

  • Запрос с множеством объектов и несколькими полями:

    query {
      object(many=true) {
        id
        name
      }
    }
    
  • Запрос с одним объектом и множеством полей:

    query {
      object(many=false) {
        id
        ... (many other fields)
      }
    }
    

Я не хочу запрашивать больше полей, чем необходимо в первом запросе, потому что это приведет к запросам с большим количеством данных (в противном случае я мог бы сделать поля идентичными, например, используя fragment, решив мою проблему).

Проблема заключается в следующем: данные, хранящиеся в кэше, нормализуются и хранятся в соответствии с __typename и id. Это означает, что запросы или атомы запросов будут перезаписывать друг друга, если они одинаковы. Следовательно, если второй запрос выполняется последним, элемент в базе данных не имеет поля name, необходимого для компонентов, связанных с первым запросом.

Самое простое решение - просто запросить name во втором запросе. Проблема в том, что это кажется хрупким и подверженным ошибкам; например, можно создать третий запрос и забыть спросить там name.

Другой вариант - сделать их разными __typename, то есть дифференцировать их на бэкэнде. Но это кажется искусственным; запросы в действительности имеют дело с одним и тем же типом объекта.

Есть ли канонический способ решения этой проблемы?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
12
0
547
1

Ответы 1

Для всех, кто попадает сюда: оказывается, что, по крайней мере, в текущей версии (@ apollo / client 3.3.6) данные объединены, так что это не проблема.

Другие вопросы по теме