在express中处理404和500错误并正确处理它们的正确方法是什么。我正在阅读一些帖子,解释处理404错误的不同方法。一个是在最后使用* route的处理程序
app.get('*',function(req,res){
res.render('404');
}
);
我遇到的另一个是使用中间件,如下所示
var express=require('express');
var app=express();
var routes=require('./routes/route.js');
app.set('view engine','ejs');
app.use(express.static(__dirname + '/public'));
app.get('/',routes.home);
app.get('/login',routes.login);
//Handling 404
app.use(function(req, res) {
res.status(404).render('404');
});
// Handling 500
app.use(function(error, req, res, next) {
res.status(500).render('500');
});
var port = process.env.PORT || 3000;
var server=app.listen(port,function(req,res){
console.log("Catch the action at http://localhost:"+port);
});
我正在使用中间件方法,但只有当我将这些中间件放在最后,这是在所有路由处理程序之后才有效。如果我将两个中间件放在' /'的路由处理程序之前和' / login' ,它不起作用。
这是处理404和500错误的正确方法吗?
答案 0 :(得分:2)
我发现使用快速生成器使用的方法是理想的。在所有路线的末尾,您包括:
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
然后一个示例路由(可能有错误)可能如下所示:
router.get('/', function(req, res, next) {
err = { message: 'Example error message', error: 'Some error'}
if(err) next(err);
if(!err){
res.render('index', { title: 'Express' });
}
});
正如@weiyin所提到的,至少记录你的错误可能是一个好主意,以帮助关注事情何时出错。
答案 1 :(得分:0)
快递按照您添加的顺序匹配路线,这就是为什么全部404路线仅在您将其放在最后时才起作用的原因。以这种方式处理500个错误很好,但至少你也应该记录它们。
答案 2 :(得分:0)
我发现以下解决方案非常适合我。定义一个错误处理模块(单独的js文件:例如errorHandler.js):
module.exports = function (app) {
/* Catch 404 and forward to error handling middleware
path defaults to “/”, will be executed for every request to the app unless handled by existing routes */
app.use((req, res, next) => {
const error = new Error(`Not Found - ${req.originalUrl}`);
res.status(404);
next(error);
});
/* error handling middleware */
app.use((err, req, res, next) => {
const statusCode = res.statusCode === 200 ? 500 : res.statusCode;
res.status(statusCode);
res.json({
message: err.message,
stack: process.env.NODE_ENV === 'production' ? {} : error.stack,
});
});
};
...并在“中间件链”末尾的应用程序中使用它,即在 app.js 中的所有路由器之后调用它,如下所示:
app.use('/api/example_1', routerExample_1);
app.use('/api/example_2', routerExample_2);
errorHandler(app);