Apollo使用buildSubgraphSchema时Union类型resolveType不生效问题
Apollo Federation中Union类型__resolveType无法识别的解决办法
我基于Apollo开发API,采用拆分的小型Schema和TypeDefs规范代码结构,用buildSubgraphSchema合并所有内容,但Union类型Attendee的__resolveType解析器始终不生效。
相关代码
__resolveType实现
Attendee: { __resolveType(obj) { if (obj.account) { return "User"; } if (obj.companies) { return "Contact"; } return null; }, },
Schema定义
type Event { id: String title: String description: String creator: Contact task: Task activity_type: ActivityType starts_at: String ends_at: String location: String attendees: [Attendee] links: [EventLink] } union Attendee = Contact | User
已尝试的配置
const schema = buildSubgraphSchema([ { typeDefs: gql` extend schema @link( url: "https://specs.apollo.dev/federation/v2.0" import: ["@key", "@shareable"] ) type Query type Mutation ************************ `, resolvers: { Query: { ...calendar_events.resolvers.Attendee, }, Mutation:{********} Attendee: { ...calendar_events.resolvers.Attendee, },
解决步骤
拆分模块单独注册
把包含AttendeeUnion定义的TypeDefs和对应的解析器放在同一个模块里,不要将Union解析器混入Query/Mutation的解析器中。在buildSubgraphSchema里单独引入这个模块,而不是把所有内容堆在一个对象里:const schema = buildSubgraphSchema([ // 基础Schema模块 { typeDefs: gql` extend schema @link( url: "https://specs.apollo.dev/federation/v2.0" import: ["@key", "@shareable"] ) type Query type Mutation `, resolvers: { Query: {... }, Mutation: {... } } }, // 日历事件模块(含Attendee的定义和解析器) { typeDefs: calendar_events.typeDefs, resolvers: calendar_events.resolvers } ]);确认解析器导出结构正确
检查calendar_events.resolvers的导出结构,确保Attendee下的__resolveType是正确挂载的,比如:// calendar_events/resolvers.js export default { Attendee: { __resolveType(obj) { if (obj.account) return "User"; if (obj.companies) return "Contact"; return null; } }, // 其他相关解析器 };验证Union成员类型的有效性
确保User和Contact类型在当前子图中存在:- 如果是当前子图定义的类型,要确保它们的Schema正确,且配置了联邦所需的
@key指令; - 如果来自其他子图,需要通过
extend type引入并标记@key,否则Apollo无法识别Union的成员类型,导致__resolveType失效。
- 如果是当前子图定义的类型,要确保它们的Schema正确,且配置了联邦所需的
避免解析器结构错误
不要把Attendee的解析器展开到Query里(你之前尝试的...calendar_events.resolvers.Attendee放在Query下是错误的),Union的解析器只能挂载在对应的Union类型字段下。
内容的提问来源于stack exchange,提问作者Dylan Lucas
相关产品推荐
相关产品推荐

