【问题标题】:Refactoring similar routes in Express, extracting callbacks to separate modules在 Express 中重构类似的路由,提取回调到单独的模块
【发布时间】:2014-07-28 18:32:29
【问题描述】:

我已将我的路线分成不同的模块。但是,仍然存在大量重复。是否有一些关于如何从路由中提取代码的良好实践和约定?

我有许多看起来像这样的路线(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 的文件中。

我正在尝试将每条路由的内容提取到可以提取到单独文件的函数中的方法。我试图尽可能地简化这个例子,以保持它的可读性,但实际上,在调用渲染之前有相当多的代码。嵌套的回调使我提取的函数非常难看。有想过用Q和promise,但怕用大锤拍苍蝇。

【问题讨论】:

  • 苍蝇来了。您始终可以使用函数生成器来填写样板文件。您还可以使用特定于模块的中间件来封装重复的逻辑。 (如果它在整个应用程序中使用,则将两者结合起来;中间件也可以由函数生成。)

标签: node.js express refactoring


【解决方案1】:

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

小清洁方式

将通用逻辑移至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 并链接回调。

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

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

【讨论】:

    猜你喜欢
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 2016-08-07
    • 2017-01-25
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多