将变量传递给外部解析引用

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
    
  ,
;

【讨论】:

以上是关于将变量传递给外部解析引用的主要内容,如果未能解决你的问题,请参考以下文章

C与C++关于*与&的传参解析

C与C++关于*与&的传参解析

如何使用 Aws AppSync 将 JWT 令牌(或任何其他变量)从父解析器传递给子解析器

Java GraphQL - 将字段值传递给对象的解析器

Java内部类引用外部类中的局部变量为何必须是final问题解析

Java内部类引用外部类中的局部变量为何必须是final问题解析