Сервер Apollo: передавайте аргументы вложенным распознавателям - PullRequest
0 голосов
/ 19 марта 2020

Мой запрос GraphQL выглядит так:

{
    p1: property(someArgs: "some_value") {
        id
        nestedField {
            id
            moreNestedField {
                id
            }
        }
    }
}

На стороне сервера я использую Apollo Server. У меня есть распознаватель для property и другие распознаватели для nestedField и moreNestedField. Мне нужно получить значение someArgs для моих вложенных распознавателей. Я попытался сделать это, используя context, доступный для распознавателя:

property: (_, {someArgs}, ctx) => {
    ctx.someArgs = someArgs;

    // Do something
}

Но это не сработает, так как контекст является общим для всех распознавателей, поэтому, если у меня несколько property в моем запросе значение контекста не будет хорошим.

Я также пытался использовать path, доступный в info, для моих вложенных распознавателей. Я могу go до поля property, но у меня нет аргументов здесь ...

Я также пытался добавить некоторые данные в info, но они не были использованы во вложенных resolvers.

Добавление аргументов для всех распознавателей не вариант, так как это сделает запрос очень раздутым и громоздким, я не хочу этого.

Есть мысли?

Спасибо!

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Параметры могут передаваться дочерним распознавателям с использованием текущего возвращаемого значения. Дополнительные данные будут удалены из ответа позже.

Я 'укажу' код Даниэля, но без указания c параметров - передайте аргументы в качестве ссылки (подходит / чище / более читабельно для большего количества аргументов):

function propertyResolver (parent, args) {
  const property = await getProperty()
  property.propertyArgs = args
  return property
}

// if this level args required in deeper resolvers
function nestedPropertyResolver (parent, args) {
  const nestedProperty = await getNestedProperty()
  nestedProperty.propertyArgs = parent.propertyArgs
  nestedProperty.nestedPropertyArgs = args
  return nestedProperty
}

function moreNestedPropertyResolver (parent) {
  // do something with parent.propertyArgs.someArgs
}

Как заявил Дэниелс, этот метод имеет ограниченную функциональность. Вы можете chain результаты и сделать что-то условно в детском резольвере. У вас будут родительские и отфильтрованные дочерние элементы ... не отфильтрованные родительские с использованием дочерних условий (как в SQL ... WHERE ... AND ... AND ... в соединенных таблицах), это можно сделать в родительском преобразователе .

1 голос
/ 19 марта 2020

Вы можете передать значение через родительское поле следующим образом:

function propertyResolver (parent, { someArgs }) {
  const property = await getProperty()
  property.someArgs = someArgs
  return property
}

function nestedPropertyResolver ({ someArgs }) {
  const nestedProperty = await getNestedProperty()
  nestedProperty.someArgs = someArgs
  return nestedProperty
}

function moreNestedPropertyResolver ({ someArgs }) {
  // do something with someArgs
}

Обратите внимание, что это будет работать, это может также указывать на основную проблему с вашим дизайном схемы в первую очередь. В зависимости от того, как вы обрабатываете эти поля (получаете их из базы данных, отправляете запросы в другой API и т. Д. c.), Может быть предпочтительнее использовать совсем другой подход - например, стремиться загрузить все внутри root распознаватель. Однако без дополнительного контекста трудно дать какие-либо дополнительные рекомендации.

...