我在 Apollo GraphQl Federation 中有三个微服务:服务 A、服务 B 和服务 C。所有服务都有数据库模型,即模型 A、模型 B、模型 C。每个服务都有自己的数据库。
模型 A 有一个字段 bIds 保存 B 模型的 ID 数组。模型 B 有一个字段 cIds 保存 C 模型的 ID 数组。
我编写了一个返回 A 列表的查询。在每个 A 中都有 B 的列表,并且 B 的每个元素都有 C 的列表。
服务 A 的模式(typeDef):
type A @key(fields: "id") {
id: ID!
bIds: [ID]
}
服务 B 的架构:
type B @key(fields: "id") {
id: ID!
cIds: [ID]
}
extend type A @key(fields: "id") {
id: ID! @external
bList: [B]
}
服务 C 的架构:
type C @key(fields: "id") {
id: ID!
}
extend type B @key(fields: "id") {
id: ID! @external
cList: [C]
}
很简单。我的问题是我想要模型 A 中的一个字段,它返回模型 C 的列表,其中包含 bList 的所有 cList 元素,如下所示:
extend type A @key(fields: "id") {
id: ID! @external
bList: [B]
derivedCList: [C] @requires(fields: "bList")
}
derivedCList 的解析器必须从 A 中获取 bList frield。我该如何实现它?@requires 的字段必须是@external。bList 不是外部的。它在服务 B 中有解析器。如果我在服务 B 中使用具有 @external declerative 的 bList 字段扩展类型 A,Apollo 会抛出关于它的异常。