Я создаю мобильное приложение Expo, используя AWS AppSync и Apollo, и у меня периодически возникает, но очень серьезная проблема с повреждением кэша или, по крайней мере, с его неправильным обновлением. К сожалению, поскольку я использую AppSync и мне нужна возможность работы в автономном режиме, я не могу перейти на последнюю версию клиента Apollo, поэтому в результате данные хранятся в Redux, есть 4 ключа верхнего уровня: offline
, rehydrated
, appsync
и appsync-metadata
.
Вот что я ожидаю:
- Запрос GraphQL для "проекта" возвращает правильные данные
- Эти данные записываются в кеш. В частности, я ожидаю, что в
appsync.ROOT_QUERY
будет запись для проекта, что-то вроде getProject({"input":{"id":"project-7"}})
плюс запись верхнего уровня в appsync
для проекта со всеми его свойствами. - Когда я выполняю мутацию, я ожидаю, что запись проекта будет обновлена.
- Поскольку проект обновлен, я ожидаю обновления пользовательского интерфейса с учетом обновленных данных.
В большинстве случаев это происходит точно так же, как описано выше. Однако иногда что-то происходит с кешем. Я не совсем уверен, что именно, но он попадает в странное состояние, и я не могу это исправить.
Вот симптомы:
- Когда я запускаю приложение,Кэш инициализируется в «старом» состоянии, которое не включает в себя запрос для project-7, хотя я запрашивал его всего за несколько минут до уничтожения приложения.
- Когда я выполняю поиск по проекту,7, он добавляет запрос
getProject...project-7
в кэш и запись для project-7, но по некоторым причинам, похоже, не имеет всех полей. - Когда я выполняю мутацию, появляется
AAS_WRITE_CACHE
, который фактически удаляет запись getProject...project-7
из кэша запросов! Мутация завершается успешно, но я вижу, что данные на сервере AppSync обновляются, и клиент нигде не регистрирует ошибки. - Пользовательский интерфейс НЕ обновляется.
Я попытался добавить update
к мутации, чтобы я мог обновить кеш самостоятельно, но когда я выполняю const data = proxy.readQuery({ query: ProjectQuery } ... )
(указав project-7
), он выдает исключение, чтобы сказать, что он не может найти этот запрос, поэтому яне могу обновить проект. Если я заново получу проект, то все снова будет работать до следующей мутации.
Что действительно сложно, так это то, что, когда мое приложение находится в этом состоянии, я не могу решить, как его исправить. Я пробовал client.resetStore()
, но он просто снова увлажняется. Я пытался позвонить AsyncStorage.clear()
, а затем остановить приложение и перезапустить его, но это тоже не работает. Как это может быть? Где хранятся данные?
Стоит еще раз сказать, что на большинстве устройств, которые я тестировал (на Android и iOS), он работал без проблем несколько дней, но на одном устройстве Android вВ частности, это происходит один раз в день или два. Дважды мне удавалось это исправить с помощью «Очистить асинхронное хранилище» в React Native Debugger, но теперь даже это, похоже, не помогает.
Итак, вот мои вопросы:
- Кто-нибудь может подсказать, что может привести к тому, что кеш попадает в это странное состояние? Или как я могу попытаться отследить проблему.
- Где хранятся данные, которые затем возвращаются? В
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",