2
私は過去7日間の各日のユーザーの総収入を計算するAPIエンドポイントを作成しています。MongooseとMongoDBを使用するAPIエンドポイントで、クライアントに応答を返す前にすべてのデータベースクエリが完了するのを待つ方法
私はmongoose .find({})メソッドを使用してデータベースに8回クエリします。 8つの.find({})呼び出しがすべて復帰した後、クライアントに応答を送信します。私はすべての.find({})呼び出しを次の.find({})を呼び出す.then関数で連結するか、すべてのクエリが完了するのを待つ簡単な方法がありますか?ここで
は私のルートがマイナス.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);
});
これは働いていました。エラーをチェックしたい場合は、(err){res.status(400)}、または何をお勧めするかといって、エラーと結果をパラメタとして受け取る最後の関数を追加しますか? – Mjuice
@Mjuiceエラーを含むコードを更新しました。コールバック(エラー)を呼び出す必要があります。エラーが発生した場合は最終的な機能チェックが必要です。res.status(400).send(エラー) – Tim
@AndrasDeakの理解 – Tim