使用异步模块的Express + Mongoose请求处理程序的更简洁的方法
Cleaner approach for Express + Mongoose request handler using async module
我正在编写一个基于快速的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});
});
}
});
};
相关文章:
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 使用自定义数据属性或将数据绑定到处理程序来处理事件
- 如何在node+express中重新运行请求处理程序
- 如何在phonegap应用程序中处理Ajax json响应
- 在基于Strophe.js的聊天应用程序中处理状态
- 使用异步模块的Express + Mongoose请求处理程序的更简洁的方法
- 是否有任何方法可以像处理jQuery中附加到XHR延迟对象的done方法处理程序一样处理websocket onmess
- "npm运行构建“;模块解析错误”;您可能需要一个适当的加载程序来处理此文件类型&”;
- iOS版离线Jquery Mobile应用程序中处理导航的正确方法
- 如何在React应用程序中处理权限检查(Redux中的状态维护)
- 使用jQuery破解上传程序以处理大文件
- Facebook Graph API-#4错误-已达到应用程序请求限制
- 防止通过父元素处理程序触发处理程序
- 取消 ajax 请求:处理程序是否仍可执行
- NodeJS http请求处理程序
- 从Express中的POST请求处理程序下载文件
- 在Koa请求处理程序中触发下载
- 在JavaScript Firebase应用程序中处理POST请求的正确方法
- 浏览器在执行“卸载”前发送http请求.处理程序
- Node.js请求处理程序不会调用函数