2016-07-04 5 views
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); 

    }); 

答えて

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

これは働いていました。エラーをチェックしたい場合は、(err){res.status(400)}、または何をお勧めするかといって、エラーと結果をパラメタとして受け取る最後の関数を追加しますか? – Mjuice

+0

@Mjuiceエラーを含むコードを更新しました。コールバック(エラー)を呼び出す必要があります。エラーが発生した場合は最終的な機能チェックが必要です。res.status(400).send(エラー) – Tim

+1

@AndrasDeakの理解 – Tim

関連する問題