用于mongodb聚合函数的async.apply失败

时间:2016-03-10 00:18:20

标签: node.js mongodb aggregation-framework async.js

我尝试使用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};

1 个答案:

答案 0 :(得分:1)

此处的代码会立即将管道应用于聚合方法,同样,也无法在代码中回调。试试这个:

async.waterfall(
  [
    function(cb) { return db.collection('campaigns').aggregate(pipeline, cb) },
    capCampaigns,
  ], 
  function(err, result) {
  }
)