如何在Apollo GraphQL联邦架构中解析其他子图类型?
跨子图类型共享与数据解析解决方案
解决Order子图的"Unknown type: MenuItem"错误
你遇到的问题核心是Order子图不知道MenuItem类型的定义——即便该类型在Menu子图中存在,也需要在Order子图里显式声明这是外部子图提供的类型,同时指定关联该类型的唯一标识字段。
修改Order子图的Schema如下:
// Order subgraph type Order @key(fields: "id") { id: ID! item: MenuItem! } // 声明外部类型MenuItem,指定其唯一标识字段和外部来源 type MenuItem @key(fields: "id") @external { id: ID! }
@key(fields: "id"):和Menu子图中MenuItem的key保持一致,让网关知道如何通过id关联两个子图中的MenuItem实例@external:明确告知Order子图,这个类型的完整定义来自其他子图(此处为Menu子图),当前子图仅需知晓它的key字段即可
跨子图数据解析的实现
当你通过网关发起查询时,网关会自动完成跨子图的数据聚合:
- 先从Order子图获取
Order的id和item.id - 再用
item.id作为参数,从Menu子图拉取对应的name、price等字段
示例查询
query GetOrderWithMenuItem { order(id: "order_123") { id item { id name price } } }
这个查询会被网关自动拆分执行:
- 向Order子图请求
order.id和order.item.id - 向Menu子图请求
MenuItem(id: "item_456")的name和price - 最终合并所有结果返回给请求方
关于@provides的使用场景
如果你的Order子图本身存储了MenuItem的部分字段(比如缓存了name),可以用@provides指令告知网关,当前子图能提供这些字段,无需再去Menu子图查询:
// Order subgraph type Order @key(fields: "id") { id: ID! item: MenuItem! @provides(fields: "name") } type MenuItem @key(fields: "id") @external { id: ID! name: String! // 声明name字段,并用@provides告知网关此子图能提供该字段 }
这属于优化场景,你的需求里暂时用不到,但可作为扩展方案参考。
内容的提问来源于stack exchange,提问作者Stretch0
相关产品推荐
相关产品推荐

