在Express中重构相似的路由,将callback提取到单独的模块中

我把我的路线分成了不同的模块。 但是,还是有相当数量的重复。 是否有一些良好的做法和约定正在形成如何从路线中提取代码?

我有许多路线,看起来像这样(Express 4.x):

router.get('/:something', function(req, res, next) { manipulate(something); Model.findOne( ..., function (err, model) { doSomethingInterestingWith(model, function(err, model) { res.render('template', { something: model} ); }); }); }); router.post('/:something', function(req, res, next) { manipulate(something); Model.new( {...}).save( function(err, model) { res.redirect('/:something'); }); }); 

这是在一个名为例如routes/something.js

我摆弄的方法是将每个path的内容提取到一个可以提取到单独文件的函数中。 我试图尽可能简化这个例子,以保持这个可读性,但实际上,在调用渲染之前有相当多的代码。 嵌套的callback使我提取的函数非常难看。 我曾想过使用Q和诺言,但是我害怕用大锤来打苍蝇。

不知道我完全根据你的第一部分问题来理解你的问题,你可以通过两种方式来实现这一点。

小清洁的方式

将公共逻辑移动到router.param

在这种情况下,router.param将被执行一次任何请求方法“GET”和“POST” http://expressjs.com/4x/api.html#router.param

 router.param('name', function(req, res, next) { manipulate(something); //set return value if needed //req.something = manipulate(something); next(); }); router.get('/:something', function(req, res) { //access returned value if needed //var modifiedSomething = req.params.something; Model.findOne( ..., function (err, model) { doSomethingInterestingWith(model, function(err, model) { res.render('template', { something: model} ); }); }); }); router.post('/:something', function(req, res) { //access returned value if needed //var modifiedSomething = req.params.something; Model.new( {...}).save( function(err, model) { res.redirect('/:something'); }); }); 

更清洁的方式

利用.all和链接callback。

“/:某事”请求.all()callback将总是运行一次,然后基于请求方法“GET”或“POST”相应的callback将得到执行。

http://expressjs.com/4x/api.html#router.route

 router.route('/:something') .all(function (request, response, next) { manipulate(something); next(); }) .get(function(req, res) { Model.findOne( ..., function (err, model) { doSomethingInterestingWith(model, function(err, model) { res.render('template', { something: model} ); }); }); }) .post(function(req, res) { Model.new( {...}).save( function(err, model) { res.redirect('/:something'); }); });