У меня есть 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 поле RootQuery, которое возвращает строку, и просто сделать 1 преобразователь, который кодирует результат с помощью JSON.stringify. Но это в первую очередь противоречило бы цели использования GraphQL.
Если вы хотите просто объединить свои запросы, вы можете добавить новый тип и новый запрос. Что-то вроде этого:
# 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 без выбора подполей, это будет невозможно - вам всегда нужно запрашивать, какие именно поля вы хотите, при запросе поля, которое возвращает тип вместо скаляр.
Запрос
{ personalInfo }
недействителен, вы должны объявить все поля, которые хотите получить. Возможно, вам это кажется ограничением, но на самом деле это особенность GraphQL.You will always get exactly what you asked for. But you have to explicitly ask for it.
Следовательно, то, о чем вы просите, невозможно.