2013-10-04 4 views
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 

Я знаю, что данные там, как я могу войти в его консоли. Почему я не могу получить доступ к определенному атрибуту массива? Есть идеи?

ответ

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() его будет выглядеть так, как если бы цикл выполнялся только один раз.

+0

Не понимал, что это будет так просто, спасибо! – Beaurocks16

Смежные вопросы