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 Service的Resolver中,编写类似这样的内容来解析扩展用户类型中的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 阿波罗联盟的主要内容,如果未能解决你的问题,请参考以下文章