表达js错误处理

时间:2013-03-28 14:13:55

标签: node.js express

我正在尝试使用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");
});

5 个答案:

答案 0 :(得分: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");
});

答案 1 :(得分:8)

一些提示:

1)您的代码无法运行,因为您的错误处理程序中间件是在到达路径之前运行的,因此错误处理程序从未有机会将错误传递给它。这种风格被称为延续传递。将错误处理程序放在中间件堆栈中。

2)当出现未处理的错误时,应该关闭服务器。最好的方法是调用server.close(),其中服务器是执行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

答案 2 :(得分:3)

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

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

为我工作:)

答案 3 :(得分:1)

安装express install connect-domain,然后是这样的:

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

答案 4 :(得分: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. 您不仅应该抛出错误消息,因为它们不准确地进行分析。如果用户界面是多语言应用程序怎么办?在这种情况下,他们可以使用code来显示本地化消息。