2

在我的 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

我知道数据在那里,因为我可以在控制台中记录它。为什么我无法访问数组的特定属性?有任何想法吗?

4

1 回答 1

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()看起来好像循环只跑过一次。

于 2013-10-04T02:57:04.950 回答