expressionjserror handling

我试图得到error handling运行与快递,而不是看到“错误!!!”的回应 就像我希望我在控制台上看到“一些exception”,然后这个过程就被终止了。 这是error handling应该如何设置,如果有的话还有另一种方法来捕捉错误?

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

有关error handling的示例应用程序/指南,请访问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)你的代码不工作,因为你的error handling中间件是在你的路由到达之前运行的,所以error handling程序从来没有机会将错误传递给它。 这种风格被称为延续传球。 把你的error handling程序放在中间件堆栈中。

2)当你有一个未处理的错误时,你应该closures服务器。 最好的办法是调用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

我有同样的问题,不知道有什么问题。 事情是,如果你有明确的errorHandler定义,那么你的自定义error handling程序永远不会被调用。 如果你有下一个代码,只需删除它:

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

为我工作:)

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

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

//我们的error handling程序

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