21

我正在尝试使用 express 运行错误处理,但没有看到“错误!!!”的响应 就像我希望我在控制台上看到“一些异常”,然后进程被终止。这是应该如何设置错误处理,如果是这样,还有另一种方法来捕获错误吗?

var express = require('express');
var app = express();

app.use(function(err, req, res, next) {
    console.log("error!!!");
    res.send("error!!!");
});

app.get('/', function(request, response) {
    throw "some exception";
    response.send('Hello World!');
});

app.listen(5000, function() {
  console.log("Listening on 5000");
});
4

5 回答 5

24

https://expressjs.com/en/guide/error-handling.html提供了有关错误处理的示例应用程序/指南 但是应该修复您的代码:

// Require Dependencies
var express = require('express');
var app = express();

// Middleware
app.use(app.router); // you need this line so the .get etc. routes are run and if an error within, then the error is parsed to the next middleware (your error reporter)
app.use(function(err, req, res, next) {
    if(!err) return next(); // you also need this line
    console.log("error!!!");
    res.send("error!!!");
});

// Routes
app.get('/', function(request, response) {
    throw "some exception";
    response.send('Hello World!');
});

// Listen
app.listen(5000, function() {
  console.log("Listening on 5000");
});
于 2013-03-28T15:38:43.940 回答
8

一些提示:

1)您的代码不起作用,因为您的错误处理程序中间件在到达您的路由之前运行,因此错误处理程序永远没有机会将错误传递给它。这种风格被称为延续传递。将错误处理程序放在中间件堆栈的最后。

2)当您遇到未处理的错误时,您应该关闭服务器。最好的方法是调用server.close(),其中 server 是做的结果var server = http.createServer(app);

这意味着,您应该执行以下操作:

var server = http.createServer(app);

app.use(function(err, req, res, next) {
  console.log("error!!!");
  res.send("error!!!");
  server.close();
});

您可能还应该超时 server.close(),以防它无法完成(毕竟您的应用程序处于未定义状态):

var server = http.createServer(app);

app.use(function(err, req, res, next) {
  console.log("error!!!");
  res.send("error!!!");

  server.close();

  setTimeout(function () {
    process.exit(1);
  }, 3*1000);
});

我创建了一个库,可以为您完成所有这些工作,并允许您定义自定义响应,包括专门的错误视图、要服务的静态文件等......:

https://github.com/ericelliott/express-error-handler

于 2013-10-17T07:06:25.597 回答
3

我有同样的问题,无法弄清楚出了什么问题。问题是,如果您定义了 express errorHandler,那么您的自定义错误处理程序将永远不会被调用。如果您有下一个代码,只需将其删除:

if ('development' === app.get('env')) {
  app.use(express.errorHandler());
}

为我工作:)

于 2014-02-18T12:57:52.483 回答
1

安装快速安装连接域,然后是这样的:

var express = require("express"),  
    connectDomain = require("connect-domain"),
    app = express(),
    errorHandler;

// 我们的错误处理程序

app.use(connectDomain());  
    errorHandler = function (err, req, res, next) {  
        res.send(500, {
           "status": "error",
           "message": err.message
        });
    console.log(err);
};

然后在设置端点时,在 use() 中添加 errorHandler:

app.get("/some/data", function (req, res) {  
    // ... do some stuff ...
    res.send(200, "Yay! Happy Success!");
}).use(errorHandler);
于 2014-04-25T08:08:30.490 回答
0

创建误差函数:

function throwError(status, code, message) {
  const error = new Error(message);
  error.name = '';
  error.status = status;
  error.code = code;
  throw error;
}

例如

throwError(422, 'InvalidEmail', '`email` should be a valid email address')

我们分配name给,''这样当我们toString出现错误时,它不会在它前面加上"Error: "

如前所述,如果您使用 express,您可以通过指定 4 个参数来创建特殊的错误处理中间件:

app.use((err, req, res, next) => {
  if (err) {
    res.status(err.status || 500).json({ code: err.code || 'Error', message: err.toString() });
  }
});

如果您不使用 express 或其他方式,请将该代码添加到您的catch处理程序中。

为什么?

  1. 现代应用程序处理 JSON,在 JSON 中抛出错误更有意义,并导致更清晰的 UI 代码。

  2. 您不仅应该抛出错误消息,因为它们解析不精确。如果 UI 是多语言应用程序怎么办?在这种情况下,他们可以使用code来显示本地化消息。

于 2019-03-26T20:54:02.890 回答