问题描述
总结
在 GraphQL Apollo 管理的联邦中,我试图弄清楚一个服务是否有可能有一个聚合字段,它返回两个独立服务的实体数组。就像,我试图支持这个用例:
query FromTwoServices {
aggregateField {
id
...on Service1Entity {
field1
}
...on Service2Entity {
field2
}
}
}
两个地方
type Service1Entity implements Aggregation
和
type Service2Entity implements Aggregation
在幕后,aggregateField
(位于服务 2 上)的解析器向下调用服务 1 到 Service1Entity
。所以这个字段聚合了两个数据集。
示例问题
在我当前的 GraphQL 设置中,我在一个服务中定义了所有这些:
interface Animal {
id: ID!
name: String!
}
type Cat implements Animal {
id: ID!
name: String!
meows: Boolean
}
type Dog implements Animal {
id: ID!
name: String!
barks: Boolean
}
当我查询我的服务时,它遇到了一个 animals
解析器,看起来像:
query Animals {
animals {
id
...on Cat {
meows
}
...on Dog {
barks
}
}
}
现在我正在创建一个 Dogs
服务。我希望 Dogs
来自 Dog 服务,而 Cats 来自 Cats 服务。此外,我仍然希望支持我的 animals
聚合字段,并且我希望将其移至 Dogs
服务。
为了支持这一点,我将 Cat
设为实体,并在两个服务之间复制了界面。为了让 Dog 服务解析 Cat
类型,我使用了“referencing”来告诉 Dog 服务 Cat
位于其他地方。
Cat 服务(用 @key
将 Cat 标记为实体):
interface Animal {
id: ID!
name: String!
}
type Cat implements Animal @key(fields: "id") {
id: ID!
name: String!
meows: Boolean
}
狗服务:
interface Animal {
id: ID!
name: String!
}
type Cat implements Animal @key(fields: "id") {
id: ID! @external
}
type Dog implements Animal {
id: ID!
name: String!
barks: Boolean
}
这个设置的问题是 Dog 服务无法启动,因为这个 GraphQL 错误:
错误:需要接口字段 Animal.name 但 Cat 未提供它。
在我的 Dog 服务中,如果我添加一个外部 name
字段,如下所示:
type Cat implements Animal @key(fields: "id") {
id: ID! @external
name: String! @external
}
然后这两个服务无法在托管联邦中组合:
此数据图缺少有效配置。 [dog] Cat.name -> 被标记为@external 但不被@requires、@key 或@provides 指令使用。
我觉得我在这里走错了路。是否有可能有这样的聚合字段,其中一个服务可以返回自己的实体,并与另一个服务的实体相结合?
我们已经有很多客户在查询 animals
字段,因此我们正在尝试在不需要客户端更改的情况下支持此更改,也就是不重新构造接口的使用。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)