我正在使用 AWS AppSync 和 Apollo 构建 Expo 移动应用程序,我遇到了一个间歇性但非常严重的问题,即缓存损坏,或者至少没有正确更新。不幸的是,因为我正在使用 AppSync 并且我想要离线功能,所以我无法升级到最新的 Apollo 客户端,因此数据存储在 Redux 中,有 4 个顶级键:offline、rehydrated和。appsyncappsync-metadata
这是我期望发生的事情:
- “项目”的 GraphQL 查询返回正确的数据
- 该数据被写入缓存。特别是,我希望
appsync.ROOT_QUERY项目中会有一个条目,比如加上项目的所有属性getProject({"input":{"id":"project-7"}})的顶级条目。appsync - 当我执行突变时,我希望项目条目能够更新。
- 由于项目已更新,我希望 UI 会刷新以反映更新的数据。
大多数情况下,这完全像上面那样发生。但是,有时缓存会发生问题。我不确定到底是什么,但它进入了一个奇怪的状态,我无法修复它。
以下是症状:
- 当我启动应用程序时,缓存被初始化为“旧”状态,不包括对 project-7 的查询,即使我在终止应用程序之前刚刚查询过它。
- 当我搜索 project-7 时,它将
getProject...project-7查询添加到缓存和 project-7 的条目,但由于某种原因似乎没有所有字段。 - 当我进行突变时,
AAS_WRITE_CACHE实际上会从查询缓存中删除条目!getProject...project-7虽然突变成功了,但我可以看到 AppSync 服务器中的数据已更新,并且客户端不会在任何地方记录任何错误。 - UI 不会更新。
我尝试向update突变添加一个,以便我可以自己更新缓存,但是当我执行const data = proxy.readQuery({ query: ProjectQuery } ... )(指定project-7)时,它会抛出一个异常,说它找不到该查询,所以我无法更新项目。如果我手动重新获取项目,那么一切都会再次运行,直到下一次突变。
真正困难的是,一旦我的应用程序处于这种状态,我就无法弄清楚如何修复它。我试过client.resetStore()了,但它只是被补水了。我试过打电话AsyncStorage.clear(),然后停止应用程序并重新启动它,但这也不起作用。怎么会这样?它在哪里存储数据?
再次值得一提的是,在我测试过的大多数设备(Android 和 iOS)上,它可以运行几天而没有任何问题,但特别是在一台 Android 设备上,它每隔一两天就会发生一次。两次我已经能够使用 React Native 调试器中的“清除异步存储”来修复它,但现在即使这样似乎也无法修复它。
所以,这是我的问题:
- 谁能建议可能导致缓存进入这种奇怪状态的原因?或者我如何尝试找出问题所在。
- 它在哪里存储然后放回的数据?里面有缓存的快照,
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",