首页 > 解决方案 > 未定义的 var 聚合(猫鼬)

问题描述

我正在尝试在聚合中使用变量,但我收到未定义的变量消息:

var rows = [{name:'hi1'}, {name:'hi2'}];

for (var i = rows.length - 1; i >= 0; i--) {
var query = Collection.aggregate([{ $match: {name: rows[i].name}}]);
query.exec((err, docs)=>{
console.log(rows[i].name)
})

错误

TypeError: Cannot read property 'name' of undefined

关于正确顺序的任何建议?

谢谢!

标签: node.jsexpressmongoose

解决方案


您正在收到经典的 js 关闭错误。它发生了,因为它是不安全的并且在循环var之外“声明” 。for你可以自己检查一下:

for(var i = 0; i<10; i++){
    console.log(i); // prints i from 0 to 9
}
console.log(i); // prints 10

在异步操作的上下文中,实际值 ifi是在这些操作结束时从内存中获取的。当您的查询完成执行时 - 循环结束,因此实际值i等于-1.

为了避免这种行为,请使用 es6let而不是var. 您可以在此视频中获得更多信息。


推荐阅读