在 express 中,当我调用 next(err) 时,下一个 tick/middleware 没有得到 called/processed
In express when i call next(err) the next tick/middleware does not get called/processed
这是一个很酷的小中间件,如果 req.url 与连接到同一路由器对象的其他路由之一匹配,则 returns 出现 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
编辑:
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
我认为问题在于您有多个路由器,并且您想要的错误处理链接无法跨路由器工作。
我建议您只创建一个路由器并共享它。例如,在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'));
然后您将同样必须在其他地方使用一个公共路由器。
这是一个很酷的小中间件,如果 req.url 与连接到同一路由器对象的其他路由之一匹配,则 returns 出现 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
编辑:
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
我认为问题在于您有多个路由器,并且您想要的错误处理链接无法跨路由器工作。
我建议您只创建一个路由器并共享它。例如,在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'));
然后您将同样必须在其他地方使用一个公共路由器。