提问者:小点点

TypeError:无法读取未定义Mongoose的属性“Push”


我在Node.js中使用Express做一个应用程序时遇到以下错误。我使用Mongoose进行我的DB操作,下面我详细介绍了我的设计

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.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");
});

我可以单独创建聚会和歌曲的集合对象,当我将歌曲添加到聚会队列时,我得到以下错误:

TypeError: Cannot read property 'push' of undefined

谁能告诉我我在这里错过了什么…!!

提前谢谢!!!


共1个答案

匿名用户

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");
});

同样把redirect放在save的回调中,它会确保只有在save完成时才调用redirect,否则它会在没有save的情况下重定向,给出JavaScript的异步性质。