Передача переменных во внешнюю ссылку разрешения - PullRequest
0 голосов
/ 06 мая 2020

Я пользуюсь Apollo Federation в течение 2 месяцев, но на самом деле застрял. Я не знаю, как передать переменную между двумя моими сервисами graphql.

У меня есть сайт (сервис сайта graphql), на котором есть заказы (сервис заказов 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 ????
  },
},

Как я могу получить доступ к переменной сводного фильтра заказа в преобразователе порядка graphql? Спасибо.

Ответы [ 2 ]

1 голос
/ 14 июня 2020

Насколько мне известно, невозможно отправить переменные из одной службы в другую, кроме 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
},
0 голосов
/ 07 июля 2020

Итак, я хочу изложить предыдущий (и я считаю правильным) ответ :

В Federation вам почти никогда не придется открывать поле с именем somethingId (userId, websiteId, et c). Часто это либо остаток от сшивки схемы, либо вы просто вернули истоки своего типа в обратном направлении. Вместо использования 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
    }
  },
};
...