如何为REST来源的JSON添加__typename适配Apollo Client GraphQL查询?
解决Apollo Client自动为嵌套对象添加__typename的问题
你遇到的核心问题是Apollo Client默认的addTypename: true只会给顶层对象添加__typename,嵌套的子对象不会自动处理,导致缓存读取时嵌套的summary因为缺少类型标识被解析为空。下面是几种靠谱的自动添加方案:
方案1:写入缓存时用transform函数手动补全嵌套__typename
在调用cache.writeQuery或通过Apollo Client写入数据时,自定义一个转换函数遍历数据结构,给每个嵌套对象加上对应GraphQL Schema里的类型名(比如RatingSummary)。
示例代码:
// 假设你的GraphQL类型是Rating(根)和RatingSummary(嵌套的summary) const addTypenamesToRatingData = (data) => { if (!data) return data; return { ...data, __typename: 'Rating', summary: { ...data.summary, __typename: 'RatingSummary' } }; }; // 写入缓存时使用转换后的 data cache.writeQuery({ query: RatingQuery, data: addTypenamesToRatingData(ratingDataWithoutTypename), });
如果有多层嵌套,可以写一个递归函数批量处理所有对象。
方案2:配置TypePolicy让Apollo自动识别嵌套类型
在Apollo Client的缓存配置里添加typePolicies,明确指定嵌套字段对应的GraphQL类型,这样Apollo在写入时会自动给这些嵌套对象加上__typename。
示例代码:
const client = new ApolloClient({ uri: '/graphql', cache: new InMemoryCache({ addTypename: true, typePolicies: { Rating: { fields: { summary: { merge(existing, incoming) { // 写入时自动给summary补全__typename return { ...incoming, __typename: 'RatingSummary' }; } } } } } }) });
这种方式一劳永逸,后续所有写入Rating类型的数据,嵌套的summary都会自动带上正确的__typename。
方案3:用apollo-link-rest自动处理REST转GraphQL的类型
如果你的REST API是通过apollo-link-rest接入的,可以在配置中直接指定每个端点返回的类型,link会自动给所有层级的对象加上对应的__typename。
示例代码:
import { RestLink } from 'apollo-link-rest'; const restLink = new RestLink({ uri: '/api/', endpoints: { getRatings: { path: 'ratings/:id', responseTransformer: (response) => { response.__typename = 'Rating'; response.summary.__typename = 'RatingSummary'; return response; } } } });
这种方式适合直接从REST API获取数据后存入Apollo缓存的场景,不需要额外手动处理。
内容的提问来源于stack exchange,提问作者Amit M
相关产品推荐
相关产品推荐

