Expressjs - 处理中间件的错误

tom*_*456 5 error-handling node.js express

我正在构建一个API(使用Expressjs v4),通常我在路由中处理错误而不是使用中间件.例如:

router.use('/', function(req, res, next) {
  ...
  if (err)
    return res.status(500).send({type: "serverError", message: "Something has gone wrong on our end."});
}
Run Code Online (Sandbox Code Playgroud)

我现在意识到中间件是"走的路".我在Expressjs网站上看到了相当有限的文档:http://expressjs.com/guide/error-handling.html 但仍然不确定一些事情.

我添加了server.js:

function errorHandler(err, req, res, next) {

}
Run Code Online (Sandbox Code Playgroud)

但我该如何处理不同类型的错误(400,404,500等)?

每次发生错误时,我发现自己写了3行代码:

//A route
var err = new Error();
err.status = 404;
return next(err);
Run Code Online (Sandbox Code Playgroud)

我可以使用以下方式访问状态:

function errorHandler(err, req, res, next) {
  console.log(err.status);
  if(err.status == "400")
    //do something
  else
    //etc etc
}
Run Code Online (Sandbox Code Playgroud)

当然有比这更简单的方法吗?我错过了什么吗?

tko*_*one 3

您应该创建自己的错误类型,该类型允许您提供处理错误所需的所有信息。

var util = require('util');

function HttpError(message, statusCode){
    this.message = message;
    this.statusCode = statusCode;
    this.stack = (new Error()).stack;
}

util.inherits(Error, HttpError);
module.exports = HttpError;
Run Code Online (Sandbox Code Playgroud)

然后将新的错误对象包含在代码中并像这样使用它

next(new HttpError('Not Found', 404));
Run Code Online (Sandbox Code Playgroud)

或者您可以疯狂地为预填充该statusCode部件的每个响应代码实现一个错误类型。

参考:在 JavaScript 中扩展 Error 的好方法是什么?