如何通过GraphQL联邦实现Relay节点查询

问题描述 投票:0回答:3

我们正在尝试通过Apollo联邦实现中继节点查询。由于Apollo不知道Relay,所以我们必须在某些服务(节点解析服务)中实现节点查询

interface Node {
  id: ID!
}

type Query {
  node(id: ID!): Node!
}

问题在于节点解析服务不知道任何实现类型,因为它们是在其他服务子图中定义的。

Apollo Gateway 向节点解析服务发送以下请求

{node(id:"dHlwZUZyb21BU2VydmljZTox"){__typename ...on TypeFromAnotherService{id __typename}}}

查询验证失败,因为服务不了解有关

TypeFromAnotherService
的任何信息。我们能够实现节点查询,因为我们在 ID 中编码了类型,但我们不知道如何修复验证。

  1. 我们可以根据联邦模式动态生成模式。这个好像用过这里但是感觉很麻烦
  2. 关闭验证并信任 Apollo GW 验证。我们不喜欢它,而且在我们后端使用的 Netflix DGS 中似乎不可能。

有什么想法可以让中继节点查询与联邦一起工作吗?

graphql relay apollo-federation
3个回答
1
投票

我们通过实现一个独立的 Node Resolver 来解决这个问题。它执行以下操作:

  1. 检查查询并动态生成模式,以防 Apollo 使用片段中的类型。节点解析器基本上将
    TypeFromAnotherService
    添加到架构中。
  2. 节点解析器从 ID 中提取类型并生成响应。

我们正在考虑开源该服务,有人感兴趣吗?


0
投票

Apollo 的联邦 GitHub 存储库上也有类似的未解决问题:https://github.com/apollographql/federation/issues/377 https://github.com/apollographql/federation/issues/1067

这些讨论给出了为什么这是一个悬而未决的问题背后的一些原因以及如何解决它的示例。此外,此示例可用于将 id 从节点映射到实体,但不是 Apollo 支持的功能:https://stackblitz.com/edit/nodemon-zbdwdj?file=README.md

如果这些不适用于您的用例,我会向最相关的 GitHub 问题添加反馈。


0
投票

我也有同样的问题。我希望在后端获得 Apollo Federation 的优势,并在前端获得 Relay 的缓存处理。我能找到的最直接的方法是创建一个能够识别所有节点类型的节点服务。有了阿波罗联邦,这相对容易。如果您有兴趣,我写了一篇关于如何实现此功能的简短文章here

© www.soinside.com 2019 - 2024. All rights reserved.