node.js - 未定义的 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
关于正确顺序的任何建议?
谢谢!
解决方案
您正在收到经典的 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
. 您可以在此视频中获得更多信息。
推荐阅读
- mysql - 尝试将转储形式 mysql 5.7 导入 8.0.23 时出错
- php - 当包需要 ^1.0 时如何在项目根目录中使用 @dev
- here-api - 如何在 HERE 免费增值中注册第二个 Android 应用程序或更改我的第一个应用程序的名称?
- angular - 如何制作一个当用户单击外部时,样式为工具提示会从 Angular 应用程序中消失?
- geospatial - r中的栅格范围不适用于地形协变量和彩色图像tif
- python - AWS CDK 使用 Python CfnResourceShare 创建 RAM 资源共享导致模板格式错误:JSON 格式不正确
- vim - 如何根据第一行影响视觉块?
- crystal-reports - 将子报表值传递给主报表的问题
- java - 如何在我的情况下解决休眠中的 n + 1 问题?
- java - 如何在 Android Studio 中与应用共享文件