我正在开发一个具有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
中定义?任何见解将不胜感激。
答案 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
开始。