【问题标题】:Correct way to handle 404 and 500 errors in express处理express中404和500错误的正确方法
【发布时间】:2021-03-08 02:15:25
【问题描述】:

在 express 中处理 404 和 500 错误并正确处理它们的正确方法是什么。我正在阅读一些解释处理 404 错误的不同方法的帖子。一个是在最后使用 * 路由处理程序

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 错误的正确方法吗?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    我发现使用 express-generator 使用的方法是理想的。在所有路线的末尾,您包括:

    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 所提到的,至少记录您的错误以帮助密切关注何时出现问题可能是个好主意。

    【讨论】:

      【解决方案2】:

      Express 按照您添加它们的顺序匹配路线,这就是为什么包罗万象的 404 路线只有在您将其放在末尾时才有效。以这种方式处理 500 个错误很好,但至少您也应该记录它们。

      【讨论】:

        【解决方案3】:

        我发现以下解决方案非常适合我。定义一个错误处理模块(单独的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);
        

        【讨论】:

          猜你喜欢
          • 2016-07-29
          • 2016-07-06
          • 2019-08-20
          • 2011-12-04
          • 2012-10-06
          • 2019-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多