Мне трудно понять, почему мои настройки graphQL и DataLoader не работают и могут использовать некоторую помощь.
У меня есть пользователь и тип Orchestra
, и я хотел бы преобразуйте User
, чтобы заполнить его поле createdOrchestras
, и проделайте то же самое с оркестром и полем owner
.
EDITED . Следующий код вызывает бесконечное l oop:
Вот загрузчики данных, которые передаются резолверам через контекст:
const DataLoader = require('dataloader');
const Orchestra = require('../models/orchestras');
const User = require('../models/users');
const batchOrchestras = async ids => {
const orchestras = await Orchestra.find({ _id: { $in: ids } });
const orchestraMap = {};
orchestras.forEach(o => {
orchestraMap[o.id] = o;
});
return ids.map(id => orchestraMap[id] || new Error(`No result for ${id}`));
}
const batchUsers = async ids => {
const users = await User.find({ _id: { $in: ids } });
const userMap = {};
users.forEach(u => {
userMap[u.id] = u;
});
return ids.map(id => userMap[id] || new Error(`No result for ${id}`));
};
module.exports = () => new DataLoader(batchUsers)
module.exports = () => new DataLoader(batchOrchestras);
Вот функции преобразования, которые должны быть способны извлечение данных для вложенных полей через загрузчики данных и изменение чувствительных полей, таких как пароль пользователя.
async function transformUser(userId, loaders) {
const user = await loaders.userLoader.load(userId.toString());
return {
...user._doc,
createdOrchestras: await Promise.all(
user._doc.createdOrchestras.map(orchestra =>
transformOrchestra(orchestra, loaders)
)
)
}
}
async function transformOrchestra(orchestraId, loaders) {
const orchestra = await loaders.orchestraLoader.load(orchestraId.toString());
return {
...orchestra._doc,
owner: transformUser(orchestra._doc.owner, loaders)
}
}
module.exports = {
transformUser,
transformOrchestra
}
Как я должен реструктурировать код, чтобы предотвратить бесконечное l oop, но сохраняя функции преобразования в качестве конечных поставщиков данные для конкретного поля?