Я учусь использовать GraphQL в эти дни. На мой взгляд, чтобы построить запрос, мне нужно построить три части:
type User{
id String
name String
cars [Car!]!
}
type Car{
id String
}
type Query{
user(id: String): User
}
{
user: async function ({id}) {
const user = await DB.user.findOne({id});
const userCars = await DB.car.find({userId: id});
user.cars = userCars;
return cars;
}
}
{
user (id: "1") {
name
cars {
id
}
}
}
Этот запрос возвращает имя пользователя и его автомобили. Функция запроса БД всегда запрос для автомобилей.
Но иногда мне просто нужна информация о пользователе:
{
user (id: "1") {
name
}
}
Я не хочу запрашивать автомобили, поэтому я надеюсь, что моя функция запроса БД может автоматически выбирать, запрашивать автомобили или нет.
Как я могу это сделать?


GraphQL.js будет поддерживать либо свойства объекта, либо методы для функций преобразователя; это обсуждается на его странице Типы объектов.
Один из способов справиться с этим — просто вставить анонимную функцию непосредственно в возвращаемый объект:
{
user: async function ({id}) {
const user = await DB.user.findOne({id});
user.cars = () => DB.car.find({userId: id});
return cars;
}
}
Другой способ — создать объект-оболочку с классом, который предоставляет свойство id и (асинхронный, ленивый) метод cars; некоторые примеры этого находятся в Документация GraphQL.js. Этот подход работает в большинстве реализаций GraphQL на большинстве языков.
Я думаю, вы изучаете автоматическое создание/отображение запроса GraphQL в запрос БД.
Все запросы зависят от базы данных/проекта, поэтому вы должны создать это сопоставление. Вы можете легко сделать это с пакетом графические поля.
Скопирован раздел ПОЧЕМУ из пакета:
An underlying REST api may only return fields based on query params.
{ user { profile { firstName }, id } }should request
/api/user?fields=profile,idwhile
{ user { email } }should request
/api/user?fields=emailImplement your resolve method like so:resolve(root, args, context, info) { const topLevelFields = Object.keys(graphqlFields(info)); return fetch(`/api/user?fields=${topLevelFields.join(',')}`); }
Спасибо, это более прямое решение. Я просмотрел "информацию", но не нашел то, что мне нужно. Этот модуль полезен!
Лучше не сжимать все это в одну функцию преобразователя. Вместо этого создайте отдельный ObjectType для Cars, который имеет свои собственные поля и собственную функцию разрешения. Таким образом, запрос автомобиля вызывается только в том случае, если запрашивается это поле.
Если вы используете RDS, присоединяйтесь к монстру и громче данных, это может помочь оптимизировать производительность ваших запросов.
Элегантное решение. Сэкономьте мое время, чтобы написать «если»!