查询返回对象时,Express Mongo回调返回undefined

时间:2013-11-27 22:00:28

标签: javascript node.js mongodb asynchronous express

我正在开发一个具有MongoDB的Node / Express项目,但是我在将Mongo查询回调的结果传递给app.js文件中的路径时遇到了问题。

在我的MongoDB设置文件中,我有以下方法访问两个集合并返回一组乘客:

RiderClass.prototype.findByCarpoolDriver = function(driverID, callback) {
    this.getCollection(function(error, rider_collection) {  //returns db.riders
      if( error ) callback(error)
      else {
        carpoolClass.findRidesForDriver(driverID, function(err, carpools){
          var rider_ids = [];
          for(var ii=0;ii<carpools.length;ii++){
            rider_ids.push(new ObjectID(carpools[ii].rider_id));
          }

          rider_collection.find( {_id:{$in : rider_ids}}).toArray(function(e, riders){
            console.log(riders);  //prints out fine
            callback(riders);

          });
       });

      }

    });
};

问题出现在我的app.js文件中,当我呼叫路线时:

var RiderClass = require('./rider_class').RiderClass;
var riderClass = new RiderClass('localhost', 27017);

app.get('/driver/:id/rides', function(req, res) {
    riderClass.findByCarpoolDriver(req.params.id, function(error, riders) {
        console.log(riders);   //undefined
        res.send(riders);
    });
});

我的Mongo文件中的console.log(riders)按照我的预期打印数组,但console.log(riders)文件中的app.js返回未定义的数组。我不认为这是一个异步问题,因为mongo日志是在未定义的app.js之前打印的。

我唯一能想到的是,查询多个集合可能有问题吗?但即便如此,我可以从记录中看到传递给callback()的数组是好的,为什么不在app.js中定义?任何见解将不胜感激。

2 个答案:

答案 0 :(得分:0)

检查一下:

// one argument passed to callback...
callback(riders);

// ...but two arguments expected:
riderClass.findByCarpoolDriver(req.params.id, function(error, riders) {
  ...
});

所以也要用两个参数调用回调:

callback(null, riders);

答案 1 :(得分:0)

当你调用riderClass.findByCarpoolDriver时,你传入的回调函数有两个参数:

function(error, riders) {
    console.log(riders);   //undefined
    res.send(riders);
}

但是在你调用callback的两个地方,你只传递一个参数。由于您不使用error参数,因此您可能希望将该回调函数更改为:

function(riders) {
    console.log(riders);   //undefined
    res.send(riders);
}

但是你会想要删除/更改这一行:

if( error ) callback(error)

因为回调从未使用error开始。