Node.js 在express中,当我调用next(err)时,不会调用/处理下一个勾号/中间件

Node.js 在express中,当我调用next(err)时,不会调用/处理下一个勾号/中间件,node.js,express,error-handling,routing,middleware,Node.js,Express,Error Handling,Routing,Middleware,这是一个很酷的小中间件,如果req.url与连接到同一路由器对象的其他路由之一匹配,则返回405错误 如果找到匹配项,它将检查是否有匹配的http谓词。如果没有匹配的http谓词,它将把标志设置为true并触发错误 我的问题是,当调用next(err)时,不会处理下一个勾号。服务器突然出现了一个错误,就好像我真的抛出了一个一样 我希望处理下一个勾号(这是我的错误处理中间件) start.js var express = require('express'), router = expre

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

如果找到匹配项,它将检查是否有匹配的http谓词。如果没有匹配的http谓词,它将把标志设置为true并触发错误

我的问题是,当调用
next(err)
时,不会处理下一个勾号。服务器突然出现了一个错误,就好像我真的抛出了一个一样

我希望处理下一个勾号(这是我的错误处理中间件)

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
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

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

我建议您只创建一个路由器并共享它。例如,在
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'));

类似地,您还必须在其他位置使用一个公共路由器。

这里有一个类似的示例:该线程说,它应该按照我的预期工作,运行队列中的下一个事件处理程序。但遗憾的是,事实并非如此。您是否100%确定中间件的顺序正确且安装正确?如果在其他中间件中放置
console.log()
,它是否被调用?我可以在该中间件之前和内部调用
console.log
,如果我不在下次调用时发送错误,它将传递给我的错误处理程序。例如:
returnnext(/*err*/)
您可以向我们展示错误处理中间件吗?阅读可能会有帮助。您的错误处理中间件是否使用示例中所示的四个参数声明?好的,我将路由保留在不同的路由器上,只要我的错误处理程序不在自己的路由器中,它就可以工作。所以我猜错误可能会冒出来,但不会掉下来。很高兴知道。