微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 InMemoryCache 为与 apollo-client 中的正则表达式匹配的任何数据指定最大缓存时间?

如何解决如何使用 InMemoryCache 为与 apollo-client 中的正则表达式匹配的任何数据指定最大缓存时间?

来自 graphql 服务器的某些字段将具有 short-lived-token-XYZ123 形状。理想情况下,我们甚至不必提前知道字段名称,因为我们编写的任何代码都将存在于库中。如何挂钩 InMemoryCache 或 ApolloClient 对象以设置值与正则表达式匹配的字段的缓存时间?让他们以设定的时间间隔轮询是非常理想的,但是因为轮询是以查询为中心的,我认为这在字段级别是不可能的。给他们一个特定的缓存时间就足够了。有没有办法使用每次读取时调用函数来挂钩 InMemoryCache?

另一种选择是使这些标记字符串成为像 Token 这样的 graphql 类型

type Token {
    id: String
}

然后在客户端中,可能可以在初始化缓存时为此类型定义自定义缓存行为

new InMemoryCache({
  typePolicies: {
    Token: {
      fields: {
        id: {
          read(cachedVal) {
            if (cacheTimeElapsed){
                return null
            } else {
                return cachedVal
            }
           
          }
        }
      },},

但我也不清楚如何使用读取功能破坏缓存。我从函数返回什么来告诉缓存它被破坏并需要重新获取?这些文档是……具有挑战性的。如果我能在每次读取时调用一个函数并做我需要做的事情,那就太理想了。

这些字段也将在 apollo-server 中用 @token 注释(出于其他原因),我们可能会在这里挂钩以某种方式告诉客户端缓存破坏这些字段。不确定如何,但这是另一种选择。

解决方法

我在 Apollo 论坛上发布了同样的问题,并得到了答案,值得注意的是,他们不支持设置特定缓存时间或通过 typePolicies 的 read 函数使缓存无效。它显然在路线图上。

建议使用第三方缓存库:https://github.com/NerdWalletOSS/apollo-cache-policies

查看“为什么会这样?”在 NerdWallet README 中,你可以看到他们提到这是 InMemoryCache 的常见痛点

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。