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
相关产品推荐
相关产品推荐

