我正在使用Node express和mongodb。我试图能够遍历显示页面的所有相关属性。我的代码是
Desktop.find({}, function(err, allDesktop) {
if(err){
console.log(err);
} else {
console.log(allDesktop); // #1
res.locals.desktops = allDesktop; // Set the data in locals
}
});
console.log("res.locals.desktops: ", res.locals.desktops); //#2
该代码是路线的一部分,#1 console.log
将所有结果都记录正确。但是console.log
#2会返回undefined
。为什么是这样?我知道我已经在完全相同的路线中将其设置为相似的其他位置,而是res.locals.laptops
我在这里缺少什么?
答案 0 :(得分:1)
这与Event Loop有关。简而言之,Desktop.find()
会执行,但您何时会完成。
这就是你的回调发挥作用的地方:function(err, allDesktop) {}
。当Desktop.find()
完成执行时调用回调。
因此代码从上到下进行评估,结果res.locals.desktops
为undefined
。这样的事情可以解决你的问题:
Desktop.find({}).exec()
.then(allDesktop => {
res.locals.desktops = allDesktop
return Promise.resolve()
})
.then(() => {
console.log(res.locals.desktops)
})
.catch(err => console.error(err))
.exec()
返回MongooseThenable
,基本上是Promise
。