在快递中,当我呼叫下一个(错误)时,下一个勾选/中间件不会被调用/处理

时间:2015-02-27 17:55:03

标签: node.js express error-handling routing middleware

如果req.url与连接到同一路由器对象的其他路由之一匹配,这是一个很酷的小中间件,它会返回405错误。

如果找到匹配,它将检查是否存在匹配的http动词,如果没有匹配的http动词,它会将该标志设置为true并触发错误。

我的问题是,当next(err)被调用时,下一个tick不会被处理。服务器爆炸时出现错误,好像我真的扔了一个。

我希望处理下一个刻度(这是我的错误处理中间件)。

start.js

var express = require('express'),
    router = express.Router();

//Other routes

router.use( function(req, res, next) {

    var flag = false;
    for (var i = 0, rl = router.stack.length; i < rl; i++) {
      var route = router.stack[i].route;
      if (route && req.url.toLowerCase() === route.path.toLowerCase()) {
        for (var method in route.methods) {
          if (route.methods.hasOwnProperty(method)) {
            if(method.toLowerCase() !== req.method.toLowerCase()){
              flag = true;
            }
          }
        }
      }
    };
    if (flag) {
      var err = new Error('Method Not Allowed');
      err.status = 405;
      return next(err);
    }

    return next();
});
module.exports = router

编辑:

routes.js

var express = require('express'),
    router = express.Router();


router.use(require('../middlewares/successHandler_logger'));

router.use('/start', require('./start/start'));
router.use('/login', require('./login/login'));

router.use(require('../middlewares/errorHandeling'));


module.exports = router

errorHandler.js

var express = require('express'),
    router = express.Router();

router.use(function(err, req, res, next) {
  err.status = err.status || 500;
  if (!err.json) {
    err.json = {
      status:err.status,
      success: false,
      message: 'oops',
    }
  };


  res.status(err.status).json(err.json);

  console.log(err.stack);

});
module.exports = router

1 个答案:

答案 0 :(得分:1)

我认为问题在于您有多个路由器,并且您想要的错误处理链接在路由器上不起作用。

我建议您只创建一个路由器并共享它。例如,在errorHandler.js中,您可以执行此操作:

module.exports = function(err, req, res, next) {
  err.status = err.status || 500;
  if (!err.json) {
    err.json = {
      status:err.status,
      success: false,
      message: 'oops',
    }
  };


  res.status(err.status).json(err.json);

  console.log(err.stack);

});

然后,这仍然有效:

router.use(require('../middlewares/errorHandeling'));

然后,您将同样必须在其他地方使用一个通用路由器。