Я пытаюсь упростить сервер 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, если попытаюсь использовать этот механизм. Должен быть какой-то способ получения адресов только по запросу, но нарисовать пробел и пока не найти пример.
Чтобы разрешить поле для Клиента только тогда, когда оно запрошено, вы захотите использовать преобразователь для этого конкретного поля, а не для решения для запроса customers
. Ваши резольверы будут выглядеть примерно так:
const domain1Resolvers = {
Query: {
customers: (_, {
first,
next
}) => customers(first, next)
},
Customer: {
addresses: ({ details: { id } }) => getAddresses(id)
},
};