如何解决如何使用 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 举报,一经查实,本站将立刻删除。