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

@apollo/client本地字段结合Service Worker使用时无法解析

排查Apollo Client本地字段(Local-only Field)不生效问题

一、先排查自身配置问题

1. 确认TypePolicy的类型名称与Schema完全匹配

检查typePolicies中的Token是否和Schema里的类型名称大小写、拼写完全一致。可以通过Apollo DevTools查看缓存中的实际类型名称,确保没有偏差。

2. 配置Token类型的唯一标识(keyFields)

你的Token类型用address作为唯一标识(Schema里标注为id),但Apollo Client默认使用id字段作为缓存键。必须在typePolicies中显式配置keyFields,否则Apollo无法正确识别缓存中的Token对象,导致本地字段的read函数无法触发:

cache: new InMemoryCache({
  typePolicies: {
    Token: {
      keyFields: ["address"], // 替换默认的id,使用address作为唯一标识
      fields: {
        priceUSD: {
          read() {
            console.log('priceUSD read function is called');
            return 100;
          },
        },
      },
    },
  },
}),

3. 确认缓存中存在对应的Token对象

本地字段的read函数只有当缓存中已经存在该Token实例时才会执行。可以通过Apollo DevTools查看Cache面板,确认getDebtTokens返回的Token已经被缓存,且包含address字段。

4. 检查Apollo Client版本兼容性

确保使用的Apollo Client版本支持本地字段功能(建议使用v3.x及以上的稳定版),旧版本可能存在指令解析或缓存逻辑的bug。

二、排查Mock Service Worker(MSW)的影响

1. 临时禁用MSW验证核心功能

注释掉MSW的注册代码,直接发起请求(或使用真实服务器返回),观察priceUSD字段是否出现、控制台是否打印日志:

  • 如果此时功能正常,说明问题出在MSW的配置或返回数据上;
  • 如果仍然不生效,问题还是在自身Apollo配置中。

2. 明确:@client字段不会出现在服务器请求中

带有@client指令的字段是客户端本地处理的,不会被包含在发送给服务器的请求里——所以MSW的请求日志中看不到priceUSD是正常现象,不能以此判断MSW有问题。

3. 检查MSW返回的Token数据完整性

确保MSW返回的token对象包含address字段(且值唯一),否则Apollo无法正确缓存Token实例,进而无法触发本地字段的read函数。

总结排查流程

  1. 先添加keyFields: ["address"]到Token的typePolicy中,这是最可能的原因;
  2. 用Apollo DevTools确认Token已被正确缓存;
  3. 临时禁用MSW验证核心逻辑是否正常;
  4. 若MSW禁用后正常,检查MSW返回的Token数据是否符合缓存要求。

内容的提问来源于stack exchange,提问作者Chrissi Grilus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:13:26