我尝试使用async lib将我的回调地狱代码转换为更加结构化。现在,我有以下代码:
db.collection('campaigns').aggregate(pipeline, function(err, campaigns) {
capCampaigns(campaigns, function(err, cappedCampaigns) {
// etc
}
});
我将其重写为
async.waterfall([
async.apply(db.collection('campaigns').aggregate, pipeline),
capCampaigns,
// etc
], function(err, result) {
}
可悲的是,async.apply
失败了:
TypeError: Cannot read property 's' of null
at Collection.aggregate (/home/beryllium/sitesrv/node_modules/mongodb/lib/collection.js:2458:35)
at /home/beryllium/sitesrv/node_modules/async/lib/async.js:760:23
at /home/beryllium/sitesrv/node_modules/async/lib/async.js:166:37
at fn (/home/beryllium/sitesrv/node_modules/async/lib/async.js:746:34)
at /home/beryllium/sitesrv/node_modules/async/lib/async.js:1213:16
at /home/beryllium/sitesrv/node_modules/async/lib/async.js:166:37
at /home/beryllium/sitesrv/node_modules/async/lib/async.js:706:43
at /home/beryllium/sitesrv/node_modules/async/lib/async.js:167:37
at Object.async.waterfall (/home/beryllium/sitesrv/node_modules/async/lib/async.js:710:44)
at chooseCampaignAndBanner (/home/beryllium/sitesrv/routes/banner.js:207:9)
我做错了什么?
其他信息: 节点版本:5.7.1 NOdeJS的MonogDB驱动程序:2.1.2
mongo失败的行:
// Build the command
var command = { aggregate : this.s.name, pipeline : pipeline};
答案 0 :(得分:1)
此处的代码会立即将管道应用于聚合方法,同样,也无法在代码中回调。试试这个:
async.waterfall(
[
function(cb) { return db.collection('campaigns').aggregate(pipeline, cb) },
capCampaigns,
],
function(err, result) {
}
)