Как достичь один ко многим отношений с GraphQL & DataLoader - PullRequest
1 голос
/ 13 января 2020

Мне трудно понять, почему мои настройки 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, но сохраняя функции преобразования в качестве конечных поставщиков данные для конкретного поля?

...