Apollo InMemoryCache静默丢弃根查询片段数据问题求助
问题解决方案
这种情况大概率是Apollo Client的InMemoryCache对分离片段的字段处理存在配置或识别问题,以下是几个直接可行的排查和解决方法:
确保片段与查询正确关联
如果你是分开定义片段和查询的,必须确保在查询文档中正确引入片段,比如使用模板字符串拼接:import { gql } from '@apollo/client'; const fragmentB = gql` fragment B on root_query { foo { id } } `; const queryA = gql` ${fragmentB} query A { ...B } `;若片段未被正确注入查询文档,Apollo缓存解析时无法识别片段对应的字段,会导致读取时丢失数据。
配置缓存类型策略
给root_query类型的foo字段显式指定合并策略,避免缓存默认的合并逻辑忽略字段:import { InMemoryCache, ApolloClient } from '@apollo/client'; const client = new ApolloClient({ uri: '你的GraphQL服务地址', cache: new InMemoryCache({ typePolicies: { root_query: { fields: { foo: { merge(existing, incoming) { // 直接返回最新数据,或根据需求合并现有数据与新数据 return incoming; }, }, }, }, }, }), });检查根查询的__typename匹配
确认服务端返回的根查询结果的__typename字段值是root_query——片段定义的on root_query必须和实际返回的类型完全一致,否则缓存会认为片段不适用于该类型,导致字段不被保留。升级Apollo Client版本
部分旧版本的Apollo Client对分离片段的缓存处理存在bug,升级到最新稳定版(比如@apollo/client@3.x的最新版本)可能直接解决问题。
内容的提问来源于stack exchange,提问作者GamerZero
相关产品推荐
相关产品推荐

