Передача параметра запроса с верхнего уровня на уровень поля

У меня есть запрос graphql, подобный следующему:

userInfo (id: userId) {
   name
   email

   address {
      street
      country
   }
}

Таким образом, name и email будут разрешены конечной точкой покоя, называемой details, однако поля address должны быть разрешены другой конечной точкой покоя, называемой address. address конечная точка отдыха также нуждается в userId, переданном в userInfo (поскольку моя служба отдыха ожидает это поле). Я не уверен, как я могу разработать свой преобразователь в этом случае?

В том же отношении, может ли поле после разрешения отправлять данные в другое поле? Возможно ли это в grapqhql?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
0
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В GraphQL каждое поле называется решать для определенного значения. В GraphQL.js это значение равно любому значению, которое было возвращено распознавателем, или, если распознаватель вернул промис, независимо от того, к чему это промис разрешил. Это значение передается распознавателю каждого дочернего поля в качестве первого параметра.

На практике это означает, что даже если ваш тип имеет определенные поля и возвращаемый вами объект должен соответствовать этим полям, он также может включать любое количество свойств дополнительный.

Например, ваш преобразователь userInfo может выглядеть примерно так:

async (parent, args, context, info) => {
  const { name, email } = await getDetails(args.id)
  return {
    name
    email
    id: args.id,
  }
}

Даже если у вас нет поля id, мы все равно можем включить его в возвращаемый объект. Таким образом, мы можем передать некоторую дополнительную информацию, например наши аргументы, преобразователям любых дочерних полей. Затем внутри вашего преобразователя address:

async (parent, args, context, info) => {
  // `parent` contains `name`, `email` and `id` properties
  return getAddress(parent.id)
}

Я бы добавил (к ответу @daniel), что вы можете явно передать этот идентификатор в запросе (без изменений преобразователя address).

userInfo (id: userId) {
  name
  email

  address (userID: userId) {
    street
    country
  }
}

Чтобы сделать его (address резолвер) универсальным, мы можем использовать оба источника параметров:

async (parent, args, context, info) => {
  // `parent` (user) can contain `id` property
  return getAddress(args.userID ? args.userID : parent.id)
}

потому что у вас должна быть возможность запрашивать только адрес (для данного userId), как это возможно с остальным API.

Другие вопросы по теме