正确处理快递中404和500错误的方法

时间:2016-01-09 17:48:16

标签: node.js express

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

3 个答案:

答案 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);