2016-04-27 6 views
0

私はエクスプレスベースのRESTサーバーを作成しています。コントローラコードの一部は以下の通りである:私が原因呼び出しの非同期の性質の異なる流れで二回order.save()関数を呼び出す必要があり非同期モジュールを使用したExpress + Mongooseリクエストハンドラのクリーナーアプローチ

/*JSON Request format 
    { params: { 
       order_id: <string>, //mandatory 
       sp_id: <string> , //optional 
       order_date: <string> //optional 
      } 
    } 

    either "sp_id" or "order_date" (or even both) would be part of request parameters. 
*/ 

var mongoose = require('mongoose'); 
var orderSS = require('../models/order'); 
var sp = require('../models/serviceProvider'); 

var update_order = function(req, res) { 
    orderSS.findById(mongoose.Types.ObjectId(req.params.order_id), function(err, order) { 
     if (err){ 
      return res.json({message:"error", code:500}); 
     } 
     if (req.params.sp_id){ 
     sp.findById(mongoose.Types.ObjectId(req.params.sp_id, function(err, serviceProvider)){ 
      order.sp_name = serviceProvider.name; 
      if (req.params.order_date) 
        order.order_date = req.params.order_date; 
      order.save(function(err){ 
       if(!err) 
       return res.json({message:"order update", code:200}); 
      }); 
      }); 
     } else if (req.params.order_date){ 
     order.order_date = req.params.order_date; 
     order.save(function(err){ 
      if (!err) 
       return res.json({message: "order updated", code:200}); 
      }); 
     } 
    }); 
}; 

。私は "非同期"モジュールを使用してよりクリーンなアプローチがあると感じています。誰かがそれをする方法を指導できる場合。

答えて

0

同様の問題を抱えている人には、以下のようにcaolan非同期モジュールを使用してこの問題を解決することができました。初めてこのモジュールを使用し、複雑な非同期タスクをきれいに管理できることを驚かせました。

var mongoose = require('mongoose'); 
var async = require('async'); 
var orderSS = require('../models/order'); 
var sp = require('../models/serviceProvider'); 

var update_order = function(req, res) { 
    orderSS.findById(mongoose.Types.ObjectId(req.params.order_id), function(err, order) { 
     if (err){ 
      return res.json({message:"error", code:500}); 
     } 
     async.parallel([ 
     //TASK1 
     function(callback) { 
      if (req.params.sp_id) { 
      sp.findById(mongoose.Types.ObjectId(req.params.sp_id, function(err, serviceProvider)){ 
       order.sp_name = serviceProvider.name; 
       callback(); 
      }); 
      } else 
      callback(); 
     }, 
     //TASK2 
     function(callback) { 
      if (order.order_date) 
      order.order_date = req.params.order_date; 
      callback(); 
     }], 
     //Below function called once both TASK1 and TASK2 are finished. 
     function() { 
      order.save(function(err){ 
      if (!err) 
      return res.json({message: "order update", code:200}); 
      }); 
     } 
    }); 
}; 
関連する問題