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

Apollo Client缓存返回错误数据:参数变更后返回旧数据的问题求助

Apollo Client缓存返回错误数据:参数变更后返回旧数据的问题求助

我遇到了Apollo Client缓存的一个棘手问题,参数变更后缓存居然返回了旧的错误数据,想请各位帮忙排查一下问题所在!

问题场景

首先我调用useGetData时传入包含test1和test2过滤器的参数,数据成功获取并存入缓存。之后我关闭test2过滤器发起新请求,新数据加载完成后,过了1秒却又变回了之前的旧数据。

为了调试,我给InMemoryCache添加了一个临时的字段策略,在getData字段的处理函数里打了断点,结果发现缓存里第一个请求没有带test2过滤器,但后续请求又包含了这个过滤器。可我明明只在一处使用了useEffect,而且反复确认它没有再传入带test2的参数,实在搞不懂为什么会出现两个请求。

相关代码片段

初始参数示例:

params = {
  filters: [{ type: "test1"}, {type: "test2"}],
  offset: 0,
  limit: 9
}

useGetData的调用代码:

const query = useGetData({
 variables: params,
 notifyOnNetworkStatusChange: true,
});

用于调试参数的InMemoryCache配置:

{
 typePolicies: {
    Query: {
      fields: {
        getData: (existing, args) => {
          return existing
        },
      }
    }
  }
}

预期与实际结果

预期结果:Apollo缓存根据调用时传入的参数,返回对应正确的数据
实际结果:传入新参数后,返回的却是旧的错误数据(用不同参数获取的历史数据)

技术栈补充

我们使用Node.js、React和Next.js进行SSR渲染,SSR阶段获取的数据会存入Apollo缓存,所以前端初始化时会直接从缓存读取数据。

实际发生的例子

  • 当使用带test1和test2过滤器的参数时,获取到的数据是[val1, val2]
  • 当发起不带test2过滤器的新请求时,一开始拿到的是正确的[val1,val3],但1秒后缓存就把旧数据[val1,val2]返回了

备注:内容来源于stack exchange,提问作者lukasmaska98

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:27:58