也许我忽略了一些东西,但我的设置非常简单。我想要做的就是找到所有应用程序'我的数据库中的文档,然后每个应用程序获取与该应用程序关联的用户文档的数量。
AppObject.find({}).exec((err, apps) => {
if (err) {
} else if (!apps) {
} else {
apps.forEach((app, index) => {
(function (app) {
console.log('app ID ' + app._id);
User.find({ appId: app._id }).count((countErr, count) => {
console.log('COUNT ERR ' + JSON.stringify(countErr));
console.log('Number of docs: ', count);
// do more things with the App and the count
});
}(app));
});
}
});
当我查看控制台日志时,我看到的是行
console.log('app ID ' + app._id);
正确打印应用程序ID,但随后
console.log('Number of docs: ', count);
显示为0。
当我在forEach循环之外运行查询(并手动提供应用程序ID)时,它会正确返回文档数。
我有点不知所措,感谢任何帮助。
谢谢!
答案 0 :(得分:0)
你很容易错误地认为NodeJS中的行是按顺序执行的。
查看一些解释NodeJS事件循环的异步文章https://blog.risingstack.com/node-hero-async-programming-in-node-js/
您将发现在第一个for
循环完成迭代后,对数据库的调用正在返回。
答案 1 :(得分:0)
我最近开始研究将Nodejs从回调地狱迁移到最新的Node版本8.x中提供的Async / Await的项目,请找到以下解决方案并试一试。谢谢。
//Create a async/await function with ES6 syntax
const findAllCount = async () => {
try{
const apps = await AppObject.find({})
await apps.forEach( app, async () => {
console.log('app ID ' + app._id)
const count = await User.find({ appId: await app._id }).count()
console.log('Number of docs: ', count)
// Here you can continue to use app and count for more things
})
}
catch(error){console.error('Error at findAllCount function: '+error)}
}
// Invoke Function
findAllCount()
希望这会有所帮助。如果没有,请提供收集架构以重现我的方案。谢谢你,祝你一切顺利。