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

ループの使用方法が原因である可能性があります。will を使用したロジック<=により、ループが 1 回余分に実行されるため、存在しない配列値にアクセスします。これは何が起こっているかのケースです:

var data = [{ foo: 'bar1' }, { foo: 'bar2' }];
for (var i = 0; i <= data.length; i++) {
  console.log(data[i].foo);
}

ループは 2 回ではなく 3 回実行されるため、次のようになります。

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長さが 1000 の配列であっても、エラーは最後の反復でのみスローされsocket.emit()、ループのように表示されます。一度だけ走った。

于 2013-10-04T02:57:04.950 に答える