3

我正在使用 AWS AppSync 和 Apollo 构建 Expo 移动应用程序,我遇到了一个间歇性但非常严重的问题,即缓存损坏,或者至少没有正确更新。不幸的是,因为我正在使用 AppSync 并且我想要离线功能,所以我无法升级到最新的 Apollo 客户端,因此数据存储在 Redux 中,有 4 个顶级键:offlinerehydrated和。appsyncappsync-metadata

这是我期望发生的事情:

  1. “项目”的 GraphQL 查询返回正确的数据
  2. 该数据被写入缓存。特别是,我希望appsync.ROOT_QUERY项目中会有一个条目,比如加上项目的所有属性getProject({"input":{"id":"project-7"}})的顶级条目。appsync
  3. 当我执行突变时,我希望项目条目能够更新。
  4. 由于项目已更新,我希望 UI 会刷新以反映更新的数据。

大多数情况下,这完全像上面那样发生。但是,有时缓存会发生问题。我不确定到底是什么,但它进入了一个奇怪的状态,我无法修复它。

以下是症状:

  1. 当我启动应用程序时,缓存被初始化为“旧”状态,不包括对 project-7 的查询,即使我在终止应用程序之前刚刚查询过它。
  2. 当我搜索 project-7 时,它将getProject...project-7查询添加到缓存和 project-7 的条目,但由于某种原因似乎没有所有字段。
  3. 当我进行突变时,AAS_WRITE_CACHE实际上会从查询缓存中删除条目!getProject...project-7虽然突变成功了,但我可以看到 AppSync 服务器中的数据已更新,并且客户端不会在任何地方记录任何错误。
  4. UI 不会更新。

我尝试向update突变添加一个,以便我可以自己更新缓存,但是当我执行const data = proxy.readQuery({ query: ProjectQuery } ... )(指定project-7)时,它会抛出一个异常,说它找不到该查询,所以我无法更新项目。如果我手动重新获取项目,那么一切都会再次运行,直到下一次突变。

真正困难的是,一旦我的应用程序处于这种状态,我就无法弄清楚如何修复它。我试过client.resetStore()了,但它只是被补水了。我试过打电话AsyncStorage.clear(),然后停止应用程序并重新启动它,但这也不起作用。怎么会这样?它在哪里存储数据?

再次值得一提的是,在我测试过的大多数设备(Android 和 iOS)上,它可以运行几天而没有任何问题,但特别是在一台 Android 设备上,它每隔一两天就会发生一次。两次我已经能够使用 React Native 调试器中的“清除异步存储”来修复它,但现在即使这样似乎也无法修复它。

所以,这是我的问题:

  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",
4

0 回答 0