Я впервые использую загрузчик данных Facebook (https://github.com/facebook/dataloader).
Я не понимаю, как им пользоваться, когда у меня 1 ко многим отношениям.
Вот репродукция моей проблемы: https://enshrined-hydrant.glitch.me.
Если вы используете этот запрос на игровой площадке:
query {
persons {
name
bestFriend {
name
}
opponents {
name
}
}
}
вы получаете ценности.
Но если вы откроете журнал консоли здесь: https://glitch.com/edit/#!/enshrined-hydrant, вы увидите эти вызовы базы данных, которых я хочу избежать:
Мой Тип человека:
type Person {
id: ID!
name: String!
bestFriend: Person
opponents: [Person]
}
Я могу использовать загрузчик данных, подходящий для bestFriend: Person, но я не понимаю, как использовать его с opponents: [Person].
Как видите, преобразователь должен возвращать массив значений.
У вас есть какие-нибудь намеки на это?


Вам необходимо создать пакетные конечные точки для работы с загрузчиком данных - он не может выполнять пакетную обработку сам по себе.
Например, вам, вероятно, понадобятся следующие конечные точки:
GET /persons - returns all people
POST /bestFriends, Array<personId>` - returns an array of best friends matchin the corresponding array of `personId`s
Тогда ваши загрузчики данных могут выглядеть так:
function batchedBestFriends(personIds) {
return fetch('/bestFriends', {
method: 'POST',
body: JSON.stringify(personIds))
}).then(response => response.json());
// We assume above that the API returns a straight array of the data.
// If the data was keyed, you could add another accessor such as
// .then(data => data.bestFriends)
}
// The `keys` here will just be the accumulated list of `personId`s from the `load` call in the resolver
const bestFriendLoader = new DataLoader(keys => batchedBestFriends(keys));
Теперь ваш преобразователь будет выглядеть примерно так:
const PersonType = new GraphQLObjectType({
...
bestFriend: {
type: BestFriendType,
resolve: (person, args, context) => {
return bestFriendLoader.load(person.id);
}
}
});