Apollo联合身份验证:联合身份验证是否会取代委托代表?

时间:2019-12-16 18:14:57

标签: graphql apollo apollo-server postgraphile apollo-federation

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

长版

我已经在互联网上搜寻了几个小时,试图弄清楚如何在不显式编写新解析器的情况下合并两个服务。阿波罗含糊地说,您可以从模式缝合迁移到联合身份验证,但请考虑以下示例:

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将数据库转换为具有CRUD所需的所有必要解析程序的GraphQL模式。已经存在一个查询,我可以通过该查询为特定用户获取照片:

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 个答案:

答案 0 :(得分:0)

有可能。您的created_by应该是User而不是ID !,并且您需要在实现Photo的服务中将User存根。