在 Apollo GraphQl Federation 中,如何在没有 @external 指令的情况下应用 @requires 逻辑?

Posted

技术标签:

【中文标题】在 Apollo GraphQl Federation 中,如何在没有 @external 指令的情况下应用 @requires 逻辑?【英文标题】:In Apollo GraphQl Federation, how to apply @requires logic without @external directive? 【发布时间】:2021-07-25 20:04:58 【问题描述】:

我在 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 会抛出关于它的异常。

【问题讨论】:

【参考方案1】:

也许这应该是 Apollon Federation 的功能请求?将@external 添加到bList 对我来说似乎是可行的,因为它在 C 的外部。

【讨论】:

以上是关于在 Apollo GraphQl Federation 中,如何在没有 @external 指令的情况下应用 @requires 逻辑?的主要内容,如果未能解决你的问题,请参考以下文章

apollo (graphQL) - 如何在查询中发送对象数组

Node/Apollo/GraphQL - 关于在 Apollo 服务器插件中使用 async/await 的建议

我可以在不使用 Apollo 的情况下使用 graphql 进行反应吗?

通过 Apollo 进行 GraphQL 查询

Apollo/GraphQL 在询问 ID 时无法获取引用的实体

Apollo (GraphQL) 在查询中获取多个元素