2

我很难弄清楚为什么我的 graphQL 和 DataLoader 设置不起作用并且可以使用一些帮助。

我有一个用户和一个Orchestra类型,我想转换一个User来填充它的createdOrchestras字段,并对 Orchestra 和一个owner字段做同样的事情。

已编辑。以下代码导致无限循环:

以下是通过上下文传递给解析器的 DataLoader:

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
}

我应该如何重构代码以防止无限循环,但将转换函数作为特定字段的最终数据提供者?

4

0 回答 0