【问题标题】:Cleaner approach for Express + Mongoose request handler using async module使用异步模块的 Express + Mongoose 请求处理程序的更清洁方法
【发布时间】:2016-08-21 21:17:30
【问题描述】:

我正在编写一个基于 express 的 REST 服务器。部分控制器代码如下:

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

由于调用的异步性质,我必须在不同的流程中调用 order.save() 函数两次。我觉得使用“异步”模块会有更清洁的方法。如果有人可以指导如何做到这一点。

【问题讨论】:

    标签: javascript node.js express asynchronous mongoose


    【解决方案1】:

    对于那些有类似问题的人,我可以使用 caolan async 模块解决这个问题,如下所示。第一次使用这个模块,很惊讶我们可以如此简洁地管理复杂的异步任务。

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

    【讨论】:

      猜你喜欢
      • 2021-02-18
      • 2016-06-16
      • 1970-01-01
      • 2021-08-01
      • 2018-05-14
      • 2019-06-20
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多