在使用Mongoose和MongoDB的API端点中,如何在将响应返回给客户端之前等待所有数据库查询完成

时间:2016-07-04 22:33:01

标签: node.js mongodb mongoose

我正在编写一个API端点,用于计算过去7天内每天的用户总收入。

我使用mongoose .find({})方法查询数据库8次。在所有8个.find({})调用返回后,我想向客户端发送响应。我应该使用调用下一个.find({})的.then函数链接所有.find({})调用,还是有更简单的方法等待所有查询完成?

为了简洁起见,这是我的路线看起来减去了一些.find({})调用:

Set HADOOP_HOME to BigInsights_Install_Directory/hadoop.
For example, /usr/iop/4.0.0.0/hadoop.

1 个答案:

答案 0 :(得分:0)

您可以使用async包。

示例:

async.parallel([
    function(callback){ ... },
    function(callback){ ... }
], function(err, results) {
    // optional callback
};

在你的情况下:

async.parallel([
    function(callback){ 

        Sale
        .find({ owner: req.params.userId, created_at: {$gte: sevenDaysAgo, $lt: sixDaysAgo} })
        .exec(function(err, sales) {

            if (err) { return callback(err); } //check for error

            sales.map(sale => {
                sevenDaysAgoRevenue += sale.total;
            });

            callback();
        });

},
    function(callback){ 
        Sale
        .find({ owner: req.params.userId, created_at: {$gte: sixDaysAgo, $lt: fiveDaysAgo} })
        .exec(function(err, sales) {

            if (err) { return callback(err); } //check for error

            sales.map(sale => {
                sixDaysAgoRevenue += sale.total;
            });

            callback();

        });

}
], function(err, results) {
    var dataRowsForWeeksRevenue = [
            [new Date(sevenDaysAgo), sevenDaysAgoRevenue],
            [new Date(sixDaysAgo), sixDaysAgoRevenue],
            [new Date(fiveDaysAgo), fiveDaysAgoRevenue],
            [new Date(fourDaysAgo), fourDaysAgoRevenue],
            [new Date(threeDaysAgo), threeDaysAgoRevenue],
            [new Date(twoDaysAgo), twoDaysAgoRevenue],
            [new Date(oneDayAgo), oneDayAgoRevenue],
            [new Date(), todaysRevenue]
        ];

        res.status(200).json(dataRowsForWeeksRevenue);
};