Соберите запросы graphql в один запрос без переписывания преобразователя или определения. - PullRequest
0 голосов
/ 02 мая 2018

У меня 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 
}

1 Ответ

0 голосов
/ 12 мая 2018

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

# 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 без выбора подполей, это не будет возможно - вам всегда нужно запрашивать, какие именно поля вы хотите, когда запрашиваете поле, которое возвращает введите вместо скаляра.

...