Node.js 如何使用GraphQL&;实现一对多关系;数据加载器

Node.js 如何使用GraphQL&;实现一对多关系;数据加载器,node.js,graphql,dataloader,Node.js,Graphql,Dataloader,我很难弄明白为什么我的graphQL&DataLoader设置不起作用,需要一些帮助 我有一个用户和一个乐队类型,我想转换一个用户来填充它的createdOrchestras字段,并对乐队和所有者字段执行相同的操作 已编辑。 以下代码导致无限循环: 以下是通过上下文传递给解析器的数据加载程序: const DataLoader=require('DataLoader'); const corchestra=require(“../models/corchestras”); const User=

我很难弄明白为什么我的graphQL&DataLoader设置不起作用,需要一些帮助

我有一个用户和一个
乐队
类型,我想转换一个
用户
来填充它的
createdOrchestras
字段,并对乐队和
所有者
字段执行相同的操作

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

以下是通过上下文传递给解析器的数据加载程序:

const DataLoader=require('DataLoader');
const corchestra=require(“../models/corchestras”);
const User=require('../models/users');
const batchOrchestras=异步ID=>{
const-orchestras=wait-corchestras.find({u-id:{$in:ids}});
康斯特交响乐团={};
管弦乐队。forEach(o=>{
管弦乐团[o.id]=o;
});
返回ids.map(id=>orchestraMap[id]| |新错误(`No result for${id}`));
}
const batchUsers=异步ID=>{
const users=wait User.find({u id:{$in:ids}});
constusermap={};
users.forEach(u=>{
userMap[u.id]=u;
});
返回ids.map(id=>userMap[id]| |新错误(`No result for${id}');
};
module.exports=()=>新数据加载器(batchUsers)
module.exports=()=>新数据加载器(batchOrchestras);
以下是转换函数,它们应该能够通过数据加载器获取嵌套字段的数据,并修改敏感字段(如用户密码)

异步函数transformUser(用户ID、加载程序){
const user=wait loaders.userLoader.load(userId.toString());
返回{
…用户。\u文件,
createdOrchestras:等待承诺(
用户._doc.createdOrchestras.map(orchestra=>
乐团(乐团、装弹工)
)
)
}
}
异步函数转换程序(管弦乐队、加载程序){
const chestration=wait loaders.orchestraLoader.load(orchestraId.toString());
返回{
…管弦乐队,
所有者:transformUser(Orchestration.\u doc.owner,loaders)
}
}
module.exports={
转换用户,
变革型管弦乐队
}

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

服务器的输出中是否没有显示任何其他错误?如果
transformUser
transformOrchestration
返回一个承诺,则可能是因为您使用了
forEach
。如果需要等待函数返回承诺,您可以使用
map
Promise。嗨,daniel,我编辑了这个问题,因为我需要从上下文获取加载程序。我使用了您的建议,将多个回调封装在一个Promise.all中,这是有意义的,尽管我触发了一个无限循环。您应该将此逻辑放在解析器中,而不是装入器中。这样,只有在实际请求字段时才会调用它。此外,您正在覆盖第一个文件中的
模块.exports