Ошибка типа: не удается прочитать свойство 'title' из неопределенного - PullRequest
0 голосов
/ 28 августа 2018

Javascript - Node.js - Экспресс - MongoDB - мангуст

У меня есть метод forEach (), который запускает цикл для каждого пользователя, добавляющего / удаляющего элементы в массиве. Он успешно добавляет соответствующее количество элементов для одного пользователя, но не может добавить остальные элементы. Как taskList.title 'undefined' с элементами, остающимися внутри массива?

User.find({}, function(err, allUsers){
    if(err){
        console.log(err);
    } else {
        console.log("Total Users: ", Number(allUsers.length));
        console.log("Users are: ", allUsers);
        Task.find({}, function(err, taskList){
            if(err){
                console.log(err);
            } else {
                console.log("Your task list: " , taskList);
                console.log("First item: " , taskList[0].title);

                let n = (Math.floor(Number(taskList.length) / Number(allUsers.length)));
                console.log("Users have", n , "items.");
                console.log("===============================");
                //assign n items to each user

               //line 151 
                allUsers.forEach(function addItem(user){
                    for(var i = 0; i < n; i++){
                        user.items.push(taskList[i].title);
                        taskList.splice(i,1);
                        console.log('item added!');
                        console.log(user.name+":", user.items);
                        console.log(taskList.length , "items remain.";
                    }
                });

            }
        });
    }
});


events.js:160
      throw er; // Unhandled 'error' event
      ^
TypeError: Cannot read property 'title' of undefined
    at addItem (/home/ubuntu/workspace/v1.4/app.js:151:56)
    at Array.forEach (native)
    at /home/ubuntu/workspace/v1.4/app.js:149:30
    at /home/ubuntu/workspace/v1.4/node_modules/mongoose/lib/model.js:4485:16
    at process.nextTick (/home/ubuntu/workspace/v1.4/node_modules/mongoose/lib/helpers/query/completeMany.js:35:39)
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickCallback (internal/process/next_tick.js:104:9)

1 Ответ

0 голосов
/ 28 августа 2018

Когда вы используете TaskList.splice (i, 1), вы обновляете длину массива TaskList, но цикл для не ссылается на TaskList.length. Вы используете кэшированное значение в n , которое является исходным значением TaskList.length.

Вам не нужно будет использовать splice или использовать другой метод зацикливания. Может быть, что-то, что использует Array.prototype.shift

var task;
while(task = TaskList.shift()) {
   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...