2016-04-27 9 views
0

Ich schreibe einen Express-basierten REST-Server. Ein Teil des Controller-Code ist wie folgt:Cleaner Ansatz für Express + Mongoose Request Handler mit Async-Modul

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

Ich habe die order.save() Funktion zweimal in unterschiedlichen Strömungs nennen, weil der asynchronen Art der Anrufe. Ich habe das Gefühl, dass das "asynchrone" Modul viel sauberer ist. Wenn jemand Anleitung dafür bekommen kann.

Antwort

0

Für diejenigen, die ähnliche Problem haben, war ich in der Lage, dieses Problem zu lösen, indem Sie asynchrone Modul coolan wie unten verwenden. Zum ersten Mal dieses Modul verwendet und erstaunt, wie sauber wir komplexe asynchrone Aufgaben verwalten können.

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