Кеш Apollo возвращается к старым данным - PullRequest
0 голосов
/ 01 ноября 2019

Я создаю мобильное приложение Expo, используя AWS AppSync и Apollo, и у меня периодически возникает, но очень серьезная проблема с повреждением кэша или, по крайней мере, с его неправильным обновлением. К сожалению, поскольку я использую AppSync и мне нужна возможность работы в автономном режиме, я не могу перейти на последнюю версию клиента Apollo, поэтому в результате данные хранятся в Redux, есть 4 ключа верхнего уровня: offline, rehydrated, appsync и appsync-metadata.

Вот что я ожидаю:

  1. Запрос GraphQL для "проекта" возвращает правильные данные
  2. Эти данные записываются в кеш. В частности, я ожидаю, что в appsync.ROOT_QUERY будет запись для проекта, что-то вроде getProject({"input":{"id":"project-7"}}) плюс запись верхнего уровня в appsync для проекта со всеми его свойствами.
  3. Когда я выполняю мутацию, я ожидаю, что запись проекта будет обновлена.
  4. Поскольку проект обновлен, я ожидаю обновления пользовательского интерфейса с учетом обновленных данных.

В большинстве случаев это происходит точно так же, как описано выше. Однако иногда что-то происходит с кешем. Я не совсем уверен, что именно, но он попадает в странное состояние, и я не могу это исправить.

Вот симптомы:

  1. Когда я запускаю приложение,Кэш инициализируется в «старом» состоянии, которое не включает в себя запрос для project-7, хотя я запрашивал его всего за несколько минут до уничтожения приложения.
  2. Когда я выполняю поиск по проекту,7, он добавляет запрос getProject...project-7 в кэш и запись для project-7, но по некоторым причинам, похоже, не имеет всех полей.
  3. Когда я выполняю мутацию, появляется AAS_WRITE_CACHE, который фактически удаляет запись getProject...project-7 из кэша запросов! Мутация завершается успешно, но я вижу, что данные на сервере AppSync обновляются, и клиент нигде не регистрирует ошибки.
  4. Пользовательский интерфейс НЕ обновляется.

Я попытался добавить update к мутации, чтобы я мог обновить кеш самостоятельно, но когда я выполняю const data = proxy.readQuery({ query: ProjectQuery } ... ) (указав project-7), он выдает исключение, чтобы сказать, что он не может найти этот запрос, поэтому яне могу обновить проект. Если я заново получу проект, то все снова будет работать до следующей мутации.

Что действительно сложно, так это то, что, когда мое приложение находится в этом состоянии, я не могу решить, как его исправить. Я пробовал client.resetStore(), но он просто снова увлажняется. Я пытался позвонить AsyncStorage.clear(), а затем остановить приложение и перезапустить его, но это тоже не работает. Как это может быть? Где хранятся данные?

Стоит еще раз сказать, что на большинстве устройств, которые я тестировал (на Android и iOS), он работал без проблем несколько дней, но на одном устройстве Android вВ частности, это происходит один раз в день или два. Дважды мне удавалось это исправить с помощью «Очистить асинхронное хранилище» в React Native Debugger, но теперь даже это, похоже, не помогает.

Итак, вот мои вопросы:

  1. Кто-нибудь может подсказать, что может привести к тому, что кеш попадает в это странное состояние? Или как я могу попытаться отследить проблему.
  2. Где хранятся данные, которые затем возвращаются? В appsync-metadata есть снимки кеша, но, разумеется, их также следует удалять, когда я очищаю весь AsyncStorage?

Я действительно застрял !!

PS Вот соответствующие (я думаю) пакеты, которые я использую:

    "apollo-client": "^2.5.1",
    "aws-amplify": "^1.1.27",
    "aws-amplify-react-native": "^2.1.11",
    "aws-appsync": "^1.7.2",
    "aws-appsync-react": "^1.2.7",
    "expo": "^33.0.0",
    "graphql": "^14.3.0",
    "graphql-tag": "^2.10.1",
    "react": "16.8.3",
    "react-apollo": "^2.5.8",
...