Собирайте запросы graphql в один запрос без перезаписи преобразователя или определения

У меня есть 3 запроса graphql, которые вызывают 3 разных сервиса:

{
  individualQ{
    name
  }

  addressQ{
    address
  }

  contactQ{
    phone
  }
}

У каждого из этих 3 запросов есть собственный преобразователь:

individualQ (root , args) {
    const individual_options = getOption(cfg.INDIVIDUAL_ENDPOINT);
    return axios(individual_options).then(res => res.data);
} ,
addressQ (root , args) {
    const address_options = getOption(cfg.ADDRESS_ENDPOINT);
    return axios(address_options).then(res => res.data);
} ,

contactQ (root , args) {
    const contact_Options = getOption(cfg.CONTACT_ENDPOINT);
    return axios(contact_Options).then(res => res.data);
}

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

Я хочу найти способ сделать следующее:

personalInfo {
     individualQ{
        name
      }

      addressQ{
        address
      }

      contactQ{
        phone
      }
}

И поэтому моя просьба будет справедливой

{
   personalInfo 
}

Запрос { personalInfo } недействителен, вы должны объявить все поля, которые хотите получить. Возможно, вам это кажется ограничением, но на самом деле это особенность GraphQL. You will always get exactly what you asked for. But you have to explicitly ask for it. Следовательно, то, о чем вы просите, невозможно.

zoran404 12.05.2018 15:15

В случае, если вам действительно нужно, вы можете иметь 1 поле RootQuery, которое возвращает строку, и просто сделать 1 преобразователь, который кодирует результат с помощью JSON.stringify. Но это в первую очередь противоречило бы цели использования GraphQL.

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

Ответы 1

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

Если вы хотите просто объединить свои запросы, вы можете добавить новый тип и новый запрос. Что-то вроде этого:

# Type definitions
type PersonalInfo {
  individual: Individual
  address: Address
  contact: Contact
}

type Query {
  personalInfo: PersonalInfo
  # other queries
}

А затем добавьте преобразователи для этих трех полей:

const resolvers = {
  PersonalInfo: {
    individual (root , args) {
      const individual_options = getOption(cfg.INDIVIDUAL_ENDPOINT);
      return axios(individual_options).then(res => res.data);
    } ,
    address (root , args) {
      const address_options = getOption(cfg.ADDRESS_ENDPOINT);
      return axios(address_options).then(res => res.data);
    } ,
    contact (root , args) {
      const contact_Options = getOption(cfg.CONTACT_ENDPOINT);
      return axios(contact_Options).then(res => res.data);
    },
  },
  Query: {
    personalInfo: () => ({})
  },
}

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

Если вы хотите передать что-либо резолверам (например, аргументы для поля запроса), вы можете сделать это через возвращаемый объект, если хотите. Затем эти данные будут доступны в качестве первого параметра, передаваемого каждому из преобразователей полей («корневое» значение).

Боковое примечание: если вы ищете способ отправить запрос GraphQL без выбора подполей, это будет невозможно - вам всегда нужно запрашивать, какие именно поля вы хотите, при запросе поля, которое возвращает тип вместо скаляр.

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