Передача параметра запроса с верхнего уровня на уровень поля - PullRequest
0 голосов
/ 18 мая 2019

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

userInfo (id: userId) {
   name
   email

   address {
      street
      country
   }
}

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

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

Ответы [ 2 ]

1 голос
/ 18 мая 2019

В 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)
}
0 голосов
/ 18 мая 2019

Я бы добавил (к ответу @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), как это возможно с rest api.

...