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

Posted

技术标签:

【中文标题】如何为带有 InMemoryCache 的 apollo-client 中的正则表达式匹配的任何数据指定最大缓存时间?【英文标题】:How can I specify maximum cache-time for any data matching a regex in apollo-client with InMemoryCache? 【发布时间】:2021-09-15 07:01:40 【问题描述】:

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

另一种选择是将这些标记字符串设为 graphql 类型 Token 之类的

type Token 
    id: String


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

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

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

这些字段也将在 apollo-server 中使用@token(出于其他原因)进行注释,我们可能会在这里挂钩以某种方式告诉客户端缓存这些字段。不知道怎么做,但这是另一种选择。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于如何为带有 InMemoryCache 的 apollo-client 中的正则表达式匹配的任何数据指定最大缓存时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Vue Apollo 导入 Apollo Client 3?

如何为带有钩子的元素数组使用多个引用?

如何为带有阴影的 UIView 赋予椭圆形状

如何为不同的分类列创建带有编码的管道?

使用 PyQT,如何为带有自定义列表的 QComboBox 过滤 mousePressEvent

如何为带有可选参数的函数编写测试