表达js错误处理

Eri*_*man 20 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");
});
Run Code Online (Sandbox Code Playgroud)

Ben*_*ans 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");
});
Run Code Online (Sandbox Code Playgroud)

  • 对于未来的人,app.router已弃用于3.x => 4.x迁移过程; 请参阅https://github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x. (9认同)

Eri*_*ott 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();
});
Run Code Online (Sandbox Code Playgroud)

您可能还应该超时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);
});
Run Code Online (Sandbox Code Playgroud)

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

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

  • 不。 1。您应该始终有一个进程监视您的服务并在它们关闭时重新启动它们。2.所有应用程序崩溃。做好计划。3. 大多数 Node 应用程序可以在不到一秒的时间内重新启动,并且大规模地,服务器将实现负载平衡,因此其他实例可以填补空缺。4. 如果你做你的工作,崩溃将是罕见的。5. 在未处理的异常之后运行代码是鲁莽的。您的代码可能会造成损坏,每个人都无法自行修复。那是愚蠢的。=) (2认同)