【问题标题】:Express Mongo callback returning undefined when query returns object当查询返回对象时,Express Mongo 回调返回未定义
【发布时间】:2013-11-27 22:00:28
【问题描述】:

我正在开发一个包含 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) 按我的预期打印数组,但我的 app.js 文件中的 console.log(riders) 返回一个未定义的。而且我不认为这是一个异步问题,因为 mongo 日志是在未定义的 app.js 之前打印的。

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

【问题讨论】:

    标签: javascript node.js mongodb asynchronous express


    【解决方案1】:

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

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

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

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

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

    if( error ) callback(error)
    

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

    【讨论】:

      【解决方案2】:

      检查一下:

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

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

      callback(null, riders);
      

      【讨论】:

        猜你喜欢
        • 2015-02-13
        • 1970-01-01
        • 2016-11-18
        • 2012-08-25
        • 2020-07-15
        • 1970-01-01
        • 2020-01-10
        • 1970-01-01
        • 2016-01-30
        相关资源
        最近更新 更多