MongoDB返回null,但查询单独工作

时间:2018-03-15 04:24:12

标签: node.js mongodb express

在post函数中,我试图检索用户的第n个活动(因为我有一个返回活动索引号的下拉列表)。当我运行查询

collection.find({'local.email':req.user.local.email},
      {'local.activities':{$slice : [currActivity,1]}});

我在Robo3T中收到了正确的活动对象。 但是,当我在post函数中的Node中调用相同的查询时,它返回一个未定义的。

app.post('/addlog',function(req,res){
var currActivity = req.body.curAct;
var score = req.body.score;
var comment = req.body.reason;
mongoose.connect('mongodb://****:****@ds044907.mlab.com:44907/intraspect',function (err, database) {
     if (err)
         throw err
     else
     {
     db = database;
     var collection = db.collection('users');
     var retrievedAct = collection.find({'local.email':req.user.local.email},
      {'local.activities':{$slice : [currActivity,1]}}).toArray().then(console.log(retrievedAct));
      if (retrievedAct.length > 0) { printjson (retrievedAct[0]); }
      console.log(currActivity);
      console.log(retrievedAct[0]);
    // console.log(req.body.newAct);
    collection.update({'local.activities.name':retrievedAct[0]},
                          {$push: {'local.activities.log' : {
                            comments: comment,
                            score: score,
                            log_time: Date.now()
                          }}})
                            .then(function(){
                                res.redirect('/homepage');
                            })
                            .catch(function() {
                                console.log('Error');
                            });
     }
 });

});

我检查了currActivity变量确实包含第n个活动的整数值。

1 个答案:

答案 0 :(得分:1)

如果您希望collection.find().toArray()的结果符合docs中指定的结果,则有两种选择:

  • 将回调传递给.toArray(),就像使用mongoose.connect()
  • 一样
  • 如果您没有通过回叫,则使用它返回的承诺

现在你们两个都没做。

此外,您在代码中混合了回调样式和Promises。我建议你解密你的代码。如果你使用的是大于8的Node.js版本,使用async / await可能会很好,它会使它变得更简单。