将变量传递给外部解析引用
Posted
技术标签:
【中文标题】将变量传递给外部解析引用【英文标题】:Passing variables to an external resolve reference 【发布时间】:2020-08-21 16:48:40 【问题描述】:我使用 Apollo Federation 已经 2 个月了,但实际上我被卡住了。我不知道如何在我的两个 graphql 服务之间传递一个变量。
我有一个网站(网站 graphql 服务),其中包含订单(orders graphql 服务)。 我有一个查询来查找网站,对于这些网站,我想要一些日期范围内的订单统计信息。这里是 typedef(网站):
type Query
websites(orderFilter: OrderFilterInput): [Website!]
type Website @key(fields: "id")
id: ID!
name: String!
url: String!
orderSummary(orderFilter: OrderSummaryFilterInput): OrderSummary
input OrderSummaryFilterInput
beginDate: Date
endDate: Date
extend type OrderSummary @key(fields: "websiteId")
websiteId: String! @external
解析器:
orderSummary: (website, orderSummaryFilter ) =>
console.log("orderSummaryFilter", orderSummaryFilter); // filters are OK
// HOW CAN I PASS orderFilterSummary to my order graphql service here ????
return __typename: "OrderSummary", websiteId: website.id ;
并订购graphql服务
Typedef 部分:
type OrderSummary @key(fields: "websiteId")
websiteId: String!
count: Int
amount: Int
解析器部分:
// order gql service
OrderSummary:
__resolveReference(website, args, info)
console.log("website id :", website.id); // I ve got my website ID
// HOW TO GET OrderSummaryFilter here ????
,
,
如何在 order graphql resolver 中访问 order summary filter 变量?谢谢。
【问题讨论】:
【参考方案1】:据我所知,不可能将变量从一个服务发送到另一个服务,然后是ID
。但是有一个解决方案。
如果您想传入变量,请在您的订单服务中扩展您的 Website
类型,而不是在网站服务中扩展订单类型。
订单类型定义:
extend type Website @key(fields: "id")
id: ID! @external
orderSummary(orderFilter: OrderSummaryFilterInput): OrderSummary @requires(fields:"id")
订单解析器:
Website:
orderSummary: async (website, orderFilter ) => getOrderSummary(orderFilter) //get orderSummary with orderFilter
,
【讨论】:
【参考方案2】:所以我想阐述一下the previous (and I believe correct) answer:
在联邦中,您几乎不必公开名为 somethingId
的字段(userId、websiteId 等)。这通常是 Schema Stitching 的遗留问题,或者你只是让你的类型起源倒退了。而不是使用somethingId
,您应该能够只使用该对象。通常,将@extend 移至其他服务将摆脱somethingId
字段,并摆脱您当前面临的问题类型:
网站服务:
type Query
websites(orderFilter: OrderFilterInput): [Website!]
type Website @key(fields: "id")
id: ID!
name: String!
url: String!
订单服务:
extend type Website @key(fields: "id")
id: ID! @external
orderSummary(orderFilter: OrderSummaryFilterInput): OrderSummary
input OrderSummaryFilterInput
beginDate: Date
endDate: Date
type OrderSummary
website: Website!
count: Int
amount: Int
解析器:
const resolvers =
Website:
orderSummary(parent, args, context)
const websiteId = parent.id;
// args is the data you wanted
,
;
【讨论】:
以上是关于将变量传递给外部解析引用的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Aws AppSync 将 JWT 令牌(或任何其他变量)从父解析器传递给子解析器