2016-11-13 7 views
0

Я получаю следующую ошибку, которая делает приложение в Node.js, используя выражение. Я использую Mongoose для моих операций БД ниже я подробно мой дизайнTypeError: Невозможно прочитать свойство «push» undefined Mongoose

Party.js

var mongoose = require("mongoose"); 

var partySchema = new mongoose.Schema({ 
    partyName: String, 
    songs: [ 
     { 
       type: mongoose.Schema.Types.ObjectId, 
       ref: "Song" 
     } 
    ] 
}); 

module.exports = mongoose.model("Party", partySchema); 

Song.js

var mongoose = require("mongoose"); 

var songsSchema = new mongoose.Schema({ 
    videoId: String, 
    videoName: String 
}); 

module.exports = mongoose.model("Song", songsSchema); 

Мои App.js

app.post("/search/addSong", function(req, res) { 
    Party.find({partyName:"hello"},function(err,party){ 
     if(err){ 
      console.log("Failed in find"); 
     } else { 
      console.log(party); 
      // console.log(typeof(req.body.videoId)); 
      var videoId = req.body.videoId; 

      var newSong = [ { 
       videoId:req.body.videoId, 
       videoName:req.body.videoName 
      } 
      ]; 
      Song.create(newSong, function(err, createdSong){ 
     if(err){ 
      console.log("Error creating a new party"); 
     } else { 
      console.log(createdSong); 
      party.songs.push(createdSong);// ERROR ON THIS LINE 
      party.save(); 
      res.redirect("/search"); 
     } 
    }); 
     } 
    }); 
    res.render("addSong"); 
}); 

Я могу индивидуально создавать объекты коллекции партии и песни, когда я добавляю песню в e, я получаю следующую ошибку:

TypeError: Cannot read property 'push' of undefined 

Может кто-нибудь, пожалуйста, дайте мне знать, что я здесь отсутствует .. !!

Заранее спасибо. !!

ответ

0

find возвращает курсор, который преобразуется в массив. если вы ожидаете одного документа, вызовите findOne.

app.post("/search/addSong", function(req, res) { 
    Party.findOne({partyName:"hello"},function(err,party){ 
     if(err){ 
      console.log("Failed in find"); 
     } else { 
      console.log(party); 
      // console.log(typeof(req.body.videoId)); 
      var videoId = req.body.videoId; 

      var newSong = [ { 
       videoId:req.body.videoId, 
       videoName:req.body.videoName 
      } 
      ]; 
      Song.create(newSong, function(err, createdSong){ 
     if(err){ 
      console.log("Error creating a new party"); 
     } else { 
      console.log(createdSong); 
      party.songs.push(createdSong);// ERROR ON THIS LINE 
      party.save(function(err){ 
      res.redirect("/search"); 
      }); 
     } 
    }); 
     } 
    }); 
    res.render("addSong"); 
}); 

поставил также перенаправлять в обратном вызове сохранить, это будет убедиться, что редирект вызываются только тогда, когда завершения сохранения, в противном случае он будет перенаправлять без сохранения, давая асинхронную природу JavaScript.

+0

Проблема с той линией, где я пытаюсь переместить объект в другой объект. –

+1

Проблема по-прежнему существует, когда вы используете findOne, как предложено в ответ? –