如何在POST之前检查数据库中已有的文档 - MongoDB,NodeJS

时间:2016-01-15 12:35:02

标签: javascript node.js mongodb

我试图在发布之前检查文档是否已存在于数据库中。我通过jQuery.post()方法发布到我的端点,即api / songs。

我想检查的是查看该歌曲是否已存在于数据库中。我可以通过查询我正在推送到数据库的songId参数来检查。如果歌曲已在数据库中,我想将数字增加1.

我一直在尝试使用mongo的findOne(),但我无法在POST中使用它。我的邮寄路线如下:

router.post('/api/songs', function(req, res){

    if(Song.findOne({songId: req.body.songId}).length > -1){
        console.log('already in there fam')
    } else{
    var song = new Song();

    song.artistName = req.body.artistName;
    song.titleName = req.body.titleName;
    song.songId = req.body.songId;
    song.songImg = req.body.songImg;


    song.save(function(err) {
        if (err) {
            console.log("Error: " + err)
        } else {
            console.log("created fam")
        }
    })

    };
    console.log(song);
    return res.json({message: "SongCreated"})

})

我的问题是我无法弄清楚findOne返回的内容。我希望它返回一个布尔值,所以我尝试count()length(),但不能让它返回true。无论如何,req发布到数据库。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

node.js中的所有i / o操作都是异步的。您的Song.findOne操作也是异步的。您应该等待它通过回调功能完成,然后检查它的结果。

Mongoose findOne方法返回一个promise。您可以阅读有关它的更多信息here

承诺执行的例子:

var query = Song.findOne({songId: req.body.songId})
query.exec(function(err, song) {

})

请尝试以下代码:

 router.post('/api/songs', function(req, res){
    Song.findOne({songId: req.body.songId}, function(err, song){
        if (err) {
            return console.log("Error: " + err)
        }
        if(song){
            return console.log('already in there fam')
        }
        var song = new Song();

        song.artistName = req.body.artistName;
        song.titleName = req.body.titleName;
        song.songId = req.body.songId;
        song.songImg = req.body.songImg;


        song.save(function(err) {
          if (err) {
            console.log("Error: " + err)
          } else {
            console.log("created fam")
          }
        })

        console.log(song);
        return res.json({message: "SongCreated"})
    })
})