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

Apollo Client缓存本地更新对象被服务端返回对象覆盖问题求助

问题

使用Apollo Client的cache.modify API在每次变更操作(mutation)时更新缓存中的MyObject,目的是确保服务端写入失败时,仍能获取到本地更新后的对象(MyObject已通过自定义ID完成规范化存储)。但当前遇到问题:通过查询获取MyObject列表时,缓存中原有同ID的对象会被服务端返回的对象覆盖。我给MyObject添加了merge函数调试,确认覆盖行为就发生在此处。当前使用cache-and-network缓存策略,且已验证cache.modify确实成功更新了缓存。

MyObject Schema

MyObject {
  my_obj_id : number,
  my_obj_field : string,
  version : number
}

当前TypePolicies配置

typePolicies: {
  MyObject: {
    keyFields: ["my_object_id"],
    //merge: false, ->  无效果

    fields: {
      my_obj_field: {
        merge(existing, incoming, { mergeObjects }) {
         // 此处现有值与传入值会合并,但我想基于version字段合并,该字段在此不可用
        }
    } 
   } // MyObject

 Query: {
    fields: {
      MyObject: {

        merge(existing = [], incoming = [], { cache, args, readField }) {
          // 现有列表与传入列表中同my_obj_id(如99)的对象是引用,完全相同
          const incomingObj = incoming[0];  // 假设仅关注第一个值
          const found = existing.find(
              (e) =>
                readField("my_obj_id", e) === readField("my_obj_id", incomingObj) &&
                readField("version", e) > readField("version", incomingObj)
            );
        // found始终为undefined,因现有对象与传入对象完全相同

        }
      }
   } // Query

 }

已尝试的方案

  • 在MyObject中设置merge: false禁用合并,但无效果;
  • 在MyObject中定义merge函数,但逻辑依赖的version字段在my_obj_field的merge函数中无法获取,无法生效。

我考虑过在MyObject的merge函数中查询缓存来决定保留现有对象还是传入对象,但感觉这不是最优方案,有没有更好的解决办法?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:42:02