2

我正在使用 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服务

类型定义部分:

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 变量?谢谢你。

4

2 回答 2

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
},
于 2020-06-14T04:48:30.640 回答
0

所以我想解释一下前面的(我相信是正确的)答案

在联邦中,您几乎不必公开一个名为somethingId(userId、websiteId 等)的字段。这通常是 Schema Stitching 的遗留问题,或者你只是让你的类型起源倒退了。而不是 using 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
    }
  },
};
于 2020-07-07T00:32:52.223 回答