Apollo Federation:Federation 是不是取代了 delegateToSchema?

Posted

技术标签:

【中文标题】Apollo Federation:Federation 是不是取代了 delegateToSchema?【英文标题】:Apollo Federation: does Federation replace delegateToSchema?Apollo Federation:Federation 是否取代了 delegateToSchema? 【发布时间】:2020-04-09 05:53:33 【问题描述】:

短版:可以用Apollo Federation代替delegateToSchema的功能吗,如果可以,怎么做?这个想法是重用来自另一个黑盒服务的解析器逻辑。

加长版

我已经在互联网上搜索了几个小时,试图弄清楚如何在不明确编写新解析器的情况下合并两个服务。 Apollo 含糊地说,您可以从模式拼接迁移到联邦,但请考虑以下示例:

type User @key(fields: "username")
  username: ID!
  photos: [Photo] @provides(fields: "created_by")


extend type Photo @key(fields: "id") 
  id: ID! @external
  created_by: ID! @external # I want to match this with username

我正在使用 PostGraphile 将我的数据库转换为 GraphQL 架构,其中包含所有必要的 CRUD 解析器。已经有一个查询可以用来获取特定用户的照片:

allPhotos(condition: created_by: $username)  ... 

这存在于我将其视为黑盒的另一项服务中。手动编写新的解析器并不理想(或容易),尤其是因为数据在那里,我只需要告诉 Apollo 如何获取它。我想也许我可以使用delegateToSchema

delegateToSchema(
  schema: pgSchema,
  operation: 'query',
  fieldName: 'allPhotos(condition: created_by: $username)',
  args:  username: args.username ,
  context: context,
  info: info
)

但从我在文档和文章中看到的情况来看,这是模式拼接,应该被联邦取代。理想情况下,如果可能的话,我只想使用联合来实现这一点。可能吗?文档没有说清楚,而且我在联邦中看到的每个示例仍然需要您编写自定义解析器。就好像指令只是提供提示以确保您在解析器中具有正确的字段,而不是实际执行任何逻辑。

感谢任何帮助!

【问题讨论】:

【参考方案1】:

这是可能的。您的created_by 应该是用户而不是 ID!,并且您需要在实现 Photo 的服务中删除用户。

【讨论】:

以上是关于Apollo Federation:Federation 是不是取代了 delegateToSchema?的主要内容,如果未能解决你的问题,请参考以下文章

聊聊WS-Federation(test)

@apollo/federation 包的替代品

如何在 python/django 中接收和验证 WS-Federation 令牌?

除了 Apollo,还有其他 GraphQL Federation 实现吗?

Apollo Federation 从 ID 解析数组

Apollo Federation 是不是支持代码优先方法?