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

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

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

为简洁起见,我的路线如下所示:减去.find({})

app.get('/loadThisWeeksRevenue/:userId', function(req, res, next) { //todays date info using momentjs var startOfToday = moment().startOf('day'); var endOfToday = moment().endOf('day'); var oneDayAgo = moment(startOfToday).subtract(1, 'days'); var twoDaysAgo = moment(startOfToday).subtract(2, 'days'); var threeDaysAgo = moment(startOfToday).subtract(3, 'days'); var fourDaysAgo = moment(startOfToday).subtract(4, 'days'); var fiveDaysAgo = moment(startOfToday).subtract(5, 'days'); var sixDaysAgo = moment(startOfToday).subtract(6, 'days'); var sevenDaysAgo = moment(startOfToday).subtract(7, 'days'); //set variables for the past 7 days revenue var sevenDaysAgoRevenue = 0; var sixDaysAgoRevenue = 0; var fiveDaysAgoRevenue = 0; var fourDaysAgoRevenue = 0; var threeDaysAgoRevenue = 0; var twoDaysAgoRevenue = 0; var oneDayAgoRevenue = 0; var todaysRevenue = 0; //Calculate 7 days ago revenue Sale .find({ owner: req.params.userId, created_at: {$gte: sevenDaysAgo, $lt: sixDaysAgo} }) .exec(function(err, sales) { if (err) { return next(err); } //check for error sales.map(sale => { sevenDaysAgoRevenue += sale.total; }); }); //Calculate 6 days ago revenue Sale .find({ owner: req.params.userId, created_at: {$gte: sixDaysAgo, $lt: fiveDaysAgo} }) .exec(function(err, sales) { if (err) { return next(err); } //check for error sales.map(sale => { sixDaysAgoRevenue += sale.total; }); }); //Calculate 1 day ago revenue Sale .find({ owner: req.params.userId, created_at: {$gte: oneDayAgo, $lt: startOfToday} }) .exec(function(err, sales) { if (err) { return next(err); } //check for error sales.map(sale => { oneDayAgoRevenue += sale.total; }); }); //Calculate today's revenue Sale .find({ owner: req.params.userId, created_at: { $gte: startOfToday, $lt: endOfToday}}) .exec(function(err, sales) { if (err) { return next(err); } //check for error sales.map(sale => { todaysRevenue += sale.total; }); }); 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); }); 

你可以使用asynchronous包。

例:

 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); };