You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apollo中如何清除带有@Connection指令的查询缓存?

Apollo中如何清除带有@Connection指令的查询缓存?

嘿,我完全懂你遇到的困扰——用@Connection标记的查询缓存,直接拿key去evict根本不管用对吧?我之前也踩过这个坑,来给你说说正确的操作方式!

首先得搞明白为什么你原来的方法不行:你试图清除ROOT_QUERY下的eventsList字段,但实际上eventsList并不是挂在ROOT_QUERY上的!你的查询是嵌套在me字段里的,@Connection(key: "eventsList")是给me对象下的events字段指定了缓存键,所以这个缓存条目是属于me对应的用户对象的,不是根查询。

那正确的步骤应该是这样的:

1. 获取me对象的缓存ID

要操作用户对象的缓存,首先得拿到它的唯一标识ID。你可以通过readQuery先读取当前用户的基本信息,再用cache.identify生成ID:

const clearCache = (): void => {
  // 先读取当前用户的id和__typename
  const meQueryResult = client.cache.readQuery({
    query: gql`query GetMeId { me { id __typename } }`
  });
  
  if (!meQueryResult?.me) return;
  
  // 生成用户对象的缓存ID
  const meCacheId = client.cache.identify(meQueryResult.me);

2. 清除指定的缓存字段

@Connection(key: "eventsList")会给events字段生成一个带key的缓存字段名,格式是${原字段名}:${key},也就是这里的events:eventsList。接下来用这个字段名和用户缓存ID去evict:

// 清除用户对象下的events:eventsList缓存
  client.cache.evict({
    id: meCacheId,
    fieldName: 'events:eventsList',
  });
  
  // 清理失效的缓存条目
  client.cache.gc();
};

补充说明

  • 如果你不确定缓存里的字段名到底是什么,可以用Apollo DevTools查看缓存结构,找到用户对象下对应的字段,就能看到@Connection生成的完整字段名了。
  • 要是你的@Connection还结合了变量,可能需要额外传入args参数,但如果只是用key固定缓存键,上面的方法就足够了。

这样操作之后,带有@Connection(key: "eventsList")的events字段缓存就会被精准清除啦!

备注:内容来源于stack exchange,提问作者Sven van Zoelen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 08:49:51