Node.js 在Express中重构类似的路由,将回调提取到单独的模块

Node.js 在Express中重构类似的路由,将回调提取到单独的模块,node.js,express,refactoring,Node.js,Express,Refactoring,我已将我的路线分为不同的模块。然而,仍然有相当数量的重复。围绕如何从路由中提取代码,是否有一些良好的实践和约定正在形成 我有很多这样的路线(Express 4.x): 这是一个名为routes/something.js的文件 我正在设法将每条路线的细节提取到一个可以提取到单独文件的函数中。我试图尽可能地简化示例,以保持可读性,但实际上,在调用render之前有相当多的代码。嵌套回调使我提取的函数非常难看。我曾考虑过使用Q和promises,但我害怕用大锤打苍蝇。我不确定我是否完全理解你的问题根据

我已将我的路线分为不同的模块。然而,仍然有相当数量的重复。围绕如何从路由中提取代码,是否有一些良好的实践和约定正在形成

我有很多这样的路线(Express 4.x):

这是一个名为
routes/something.js
的文件


我正在设法将每条路线的细节提取到一个可以提取到单独文件的函数中。我试图尽可能地简化示例,以保持可读性,但实际上,在调用render之前有相当多的代码。嵌套回调使我提取的函数非常难看。我曾考虑过使用Q和promises,但我害怕用大锤打苍蝇。

我不确定我是否完全理解你的问题根据问题的第一部分,你可以通过两种方式实现这一点

小清道 将公共逻辑移到router.param

router.param将对任何请求方法执行一次,在本例中为“get”和“POST”

更干净的方式 利用.all并链接回调

“/:something”request.all()回调将始终运行一次,然后根据请求方法“GET”或“POST”执行相应的回调


苍蝇来了。您可以始终使用函数生成器来填充样板文件。您还可以使用特定于模块的中间件来封装重复的逻辑。(如果在整个应用程序中使用,则将两者结合使用;中间件也可以由函数生成。)
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');
  });
});
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');
  });
});
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');
  });
});