使用异步模块的Express + Mongoose请求处理程序的更简洁的方法

Cleaner approach for Express + Mongoose request handler using async module

本文关键字:程序 请求处理 方法 简洁 Mongoose 异步 模块 Express      更新时间:2023-09-26

我正在编写一个基于快速的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() 函数两次。我觉得使用"异步"模块会有更干净的方法。如果有人可以指导如何做到这一点。

对于那些有类似问题的人,我能够使用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});
          });
       }
    });
};