Клиент Apollo / AWS AppSync JavaScript SDK изменяет результат запроса - PullRequest
0 голосов
/ 03 сентября 2018

Я выполняю простой запрос, который корректно возвращается с помощью консоли 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
        }
    }
}

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

1 Ответ

0 голосов
/ 06 сентября 2018

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

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

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

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

...