Клиент Apollo / SDK для JavaScript AWS AppSync, изменяющий результат запроса

Я выполняю простой запрос, который возвращается правильно с помощью консоли AppSync, но когда я выполняю тот же запрос из моего приложения, данные возвращаются неправильно. В частности, в возвращаемом объекте есть массив дочернего типа, и хотя количество экземпляров в массиве правильное, каждый экземпляр является копией первого экземпляра.

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

Вывод в консоль:

{
  "data": {
    "getTemplates": [
      {
        "name": "test template",
        "data": [
          {
            "name": "Assigned User",
            "format": "String"
          },
          {
            "name": "Office",
            "format": "String"
          },
          {
            "name": "Department",
            "format": "String"
          }
        ]
      }
    ]
  }
}

Вывод журнала браузера из приложения:

0
:
{id: null, name: "Assigned User", format: "String", __typename: "Field", Symbol(id): "Field:null"}
1
:
{id: null, name: "Assigned User", format: "String", __typename: "Field", Symbol(id): "Field:null"}
2
:
{id: null, name: "Assigned User", format: "String", __typename: "Field", Symbol(id): "Field:null"}

Код запроса и регистрации:

<Query query={getTemplatesQuery}>
    {({ loading, error, data }) => {
        if (loading) return null;
        if (error) return `Error: ${error}`;

        console.log(data);
        console.log(data.getTemplates);
        return (
            <DataTable data={data.getTemplates} />
        );
    }}
</Query>

Запрос, скопируйте и вставьте из приложения в консоль для тестирования:

{
    getTemplates {
        id
        name
        author
        data {
            id
            name
            format
        }
    }
}

Может ли кто-нибудь сказать мне, что может быть причиной этого? Есть ли простой способ проверить это на другом клиенте?


person Exitialis    schedule 03.09.2018    source источник


Ответы (1)


Кеш Apollo выполняет процесс нормализации

По умолчанию InMemoryCache будет пытаться использовать часто встречающиеся первичные ключи id и _id для уникального идентификатора, если они существуют вместе с __typename на объекте.

Поскольку возвращаемые вами результаты не имеют поля идентификатора, для них используется ключ "Field:null" для всех из них.

Решение в этом случае - вернуть идентификатор в ваших Field потомках (в журналах, которые вы вставили, их значение - null). Или используйте dataIdFromObject, чтобы дать кешу подсказки о том, как сгенерировать ключи кеша для ваших объектов.

person Manuel Iglesias    schedule 06.09.2018