graphql-tools: ленивая загрузка?

1

Я пытаюсь упростить сервер graphql с помощью графических инструментов Apollo. Я хочу сделать ленивый выбор, но не смог вернуть обещание так, как мог, используя javascript-классы в качестве решателей.

Вот что я получил:

схема

type Customer {
    details: Contact!
    addresses: [Address]!
}
    extend type Query {
        customers(first: Int = 0, next: Int = 50): [Customer]
        customer(id: Int!): Customer
    }

Резольвер

const domain1Resolvers = {
    Query: {
        customers: (_, {
            first,
            next
        }) => customers(first, next)
    }
};

метод разрешения:

const customers = (first, next) => {
    return new Promise(resolve => {
        var q =
            '
                SELECT *, company as organization FROM customer
                ORDER BY id DESC
                LIMIT ?, ?';
        sql.query(q, [first, next], function(err, rows) {
            if (err) {
                throw Error(err);
            }
            resolve(rows.map(r => {
                return {
                    details: r,
                    addresses: () => getAddresses(r.id),
                }
            }));
        });
    })
};

Метод getAddresses вызывается только при запросе адресов. В подходе, основанном на классе, я могу иметь getAddresses, чтобы вернуть Promise, но он будет жаловаться на то, что не вернет Iterable, если попытаюсь использовать этот механизм. Должен быть какой-то способ получения адресов только по запросу, но нарисовать пробел и пока не найти пример.

Теги:
graphql-js
apollo-server

1 ответ

2
Лучший ответ

Чтобы разрешить поле для Клиента только тогда, когда оно запрошено, вы захотите использовать преобразователь для этого конкретного поля, а не для решения для запроса customers. Ваши резольверы будут выглядеть примерно так:

const domain1Resolvers = {
  Query: {
    customers: (_, {
      first,
      next
    }) => customers(first, next)
  },
  Customer: {
    addresses: ({ details: { id } }) => getAddresses(id)
  },
};
  • 0
    Brilliant! Спасибо. Я не встречал ничего подобного.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню