Graphql 阿波罗联盟

Posted

技术标签:

【中文标题】Graphql 阿波罗联盟【英文标题】:Graphql Apollo Federation 【发布时间】:2019-12-09 04:20:41 【问题描述】:

当我需要在彼此之间使用不同的服务时,我相信我了解如何使用 @key 扩展类型。举个例子,以防我这个新手,我的理解不正确。例如,如果我为Accounts 提供服务,为Users 提供服务,在后者中我有类似的东西,

type Users @key(fields: "accountIds") 
  id: ID!
  accountIds: [ID]

我会通过在我的Accounts 服务中添加一个文件来扩展它来扩展Users,例如:

extend type Users @key(fields: "accountIds") 
    accountIds: [ID] @external
    accounts: [Accounts!]

我还需要添加一个解析器来设置accounts 应该是什么。首先,上面说的对吗?我明白我在做什么还是我错过了什么?

接下来。我将如何处理在未联合的现有代码库中看起来像这样的类型: union AccountResult = Accounts | SelectedAccounts

如果我需要在其他一些服务中使用 AccountResult 作为类型,我将如何使其可用?鉴于我上面的内容,我不知道我怎么能做到这一点。再次重申,我是新手,因此感谢您的耐心等待。

【问题讨论】:

我觉得第一部分没问题。我假设您在尝试添加 SelectedAccount 内容之前已使其工作,因此您应该知道第一个问题对的答案;-) 不过,我不确定我是否得到您的第二个答案。如果您想扩展它们返回的数据,AFAIU 所有服务都需要至少启用联合(主要是添加@key 指令).. 【参考方案1】:

用户联合服务

type Users @key(fields: "id") 
  id: ID!
  accountIds: [String]

Accounts Federated Service中扩展用户类型

extend type Users @key(fields: "id") 
    id: ID! @external
    accounts: [Accounts]

帐户联合服务中的

帐户类型可能如下所示;

type Accounts @key(fields: "id") 
      id: ID!
      accountHolderId: String!
      accountType: String!
      amount: Float!
    

之后在Accounts Federated ServiceResolver中,编写类似这样的内容来解析扩展用户类型中的accounts字段 p>

const resolver = 
  Users: 
    async accounts(users) 

     // get account ids array of users using users.accountId
     // you can make a DB call and get Accounts Service Data and filter ids 
     // of those retrieved data with users.accountId data
     // finally return filtered data

    
  

“异步帐户”方法在解析器中有这样的签名;异步帐户(父数据、传递的值、上下文、信息) 我使用 users 参数作为 父数据 其他参数是可选的 除此之外,您还可以使用 Resolve Reference ( __resolveReference(ref) ) 方法将数据从一个服务附加到另一个服务。

【讨论】:

以上是关于Graphql 阿波罗联盟的主要内容,如果未能解决你的问题,请参考以下文章

小型项目的阿波罗联盟

http解析异常阿波罗Graphql

如何连续进行 graphql 调用?反应阿波罗

android graphQL 阿波罗

反应中的奇怪错误-使用阿波罗/客户端-graphql

与石墨烯后端反应阿波罗中 graphql 接口类型的常见字段