在我的app.js中,我有以下内容:
post.find({'global': true}).sort('date').exec(function(err, data) {
for (var i = 0; i <= data.length; i++) {
console.log(data[i].email);
//socket.emit('Post', {name: data[i].name, cont: data[i].cont, date: data[i].date});
}
});
当我使用
时console.log(data[i]);
我以
的形式获取数据{name: blah, cont: blah, email: blah, etc}
但是当我尝试发布数据时
data[i].attribute
我收到错误
TypeError: Cannot read property 'attribute' of undefined
我知道数据存在,因为我能够在控制台中记录它。为什么我无法访问数组的特定属性?有什么想法吗?
答案 0 :(得分:1)
可能是因为你正在使用你的循环。使用<=
的逻辑将导致循环运行一次额外的时间,因此访问不存在的数组值。这是发生的事情:
var data = [{ foo: 'bar1' }, { foo: 'bar2' }];
for (var i = 0; i <= data.length; i++) {
console.log(data[i].foo);
}
循环将运行三次而不是两次,导致这种情况发生:
console.log(data[0].foo); // bar1
console.log(data[1].foo); // bar2
console.log(data[2].foo); // TypeError: Cannot read property 'foo' of undefined
要解决此问题,请将循环更改为for (var i = 0; i < data.length; i++)
。
另外,一个调试提示:你应该在检查像你这样的错误时尝试使用输出,即使data
是一个长度为千的数组,错误仍然只会在最后一次迭代时抛出,并且使用socket.emit()
,它看起来好像循环只运行一次。