Node.js 使用ExpressJS处理错误
我尝试用ExpressJS处理503和500个错误,但它只适用于404错误 我的中间件:Node.js 使用ExpressJS处理错误,node.js,express,Node.js,Express,我尝试用ExpressJS处理503和500个错误,但它只适用于404错误 我的中间件: var error = function(server) { // 404 server.app.use(function(request, response) { response.status(404); response.redirect('/404'); }); // 500 server.app.use(function(error, request, re
var error = function(server) {
// 404
server.app.use(function(request, response) {
response.status(404);
response.redirect('/404');
});
// 500
server.app.use(function(error, request, response, next) {
response.status(500);
response.redirect('/500');
next(error);
});
// 503
server.app.use(function(error, request, response, next) {
response.status(503);
response.redirect('/503');
next(error);
});
};
module.exports = error;
function error500(request, response) {
response.render('0-templates/' + response.locals.options.template + '/500', {
_layoutFile: false,
error: //how to get the error ?
});
}
我的控制器中的功能(使用路由):
var error = function(server) {
// 404
server.app.use(function(request, response) {
response.status(404);
response.redirect('/404');
});
// 500
server.app.use(function(error, request, response, next) {
response.status(500);
response.redirect('/500');
next(error);
});
// 503
server.app.use(function(error, request, response, next) {
response.status(503);
response.redirect('/503');
next(error);
});
};
module.exports = error;
function error500(request, response) {
response.render('0-templates/' + response.locals.options.template + '/500', {
_layoutFile: false,
error: //how to get the error ?
});
}
您缺少
404
回调的error
参数,这使express相信它是一个中间件,而不是一个错误处理程序,因此对通过所述中间件的每个请求返回404
您还应该向所有错误处理程序添加next
参数
发件人:
以与其他中间件函数相同的方式定义错误处理中间件函数,除了错误处理函数有四个参数而不是三个:(err、req、res、next)
不确定为什么要使用3个不同的函数,因为express中只有一个错误处理程序,您可以使用以下内容:
server.app.use((err, req, res, next) => {
if (err.code) {
res.status(err.code);
console.log(err);
return res.redirect('/'+err.code);
} else {
res.status(500);
console.log(err);
return res.redirect('/500');
}
});
或者类似的,为了执行错误响应,您应该从逻辑代码中调用next(err)
来源:和为什么您的500和503函数没有与404函数相同的签名?为什么要使用try-catch块,当某个结果导致500或503
抛出新错误(“内部服务错误”)
以响应。状态(500)
或(503)
在您的路由中。另外,当您用500或503交换第一个状态代码时会发生什么?它运行404是因为它是第一个吗?它与next(error)
一起工作,但我无法在控制器中获取错误消息。请参阅编辑。错误处理程序在中间件和控制器之后执行,因此错误处理程序中的next()
调用express的默认错误处理程序