从Node.JS中的未捕获exception中恢复

好的,所以我有一个问题。 如果在处理HTTP请求时发生未捕获的exception,我没有机会调用http.ServerResponse对象上的end()方法。 因此,服务器永远挂起,永远不会满足要求。

这是一个例子:

var express = require('express'); var app = express.createServer(); var reqNum = 0; app.get('/favicon.ico', function(req, res) {res.send(404);}); app.get('*', function(req, res, next) { console.log("Request #", ++reqNum, ":", req.url); next(); }); app.get('/error', function(req, res, next) { throw new Error("Problem occurred"); }); app.get('/hang', function(req, res, next) { console.log("In /hang route"); setTimeout(function() { console.log("In /hang callback"); if(reqNum >= 3) throw new Error("Problem occurred"); res.send("It worked!"); }, 2000); }); process.on('uncaughtException', function(err) { console.log("Uncaught exception!", err); }); app.listen(8080); 

如果您访问/错误,则会发生exception,但会被捕获。 用户收到错误消息 – 没有问题。 如果我访问/挂起,虽然,服务器将最终抛出一个未捕获的exception,并永远挂起。 任何后续的/挂起请求将挂起。

这很糟糕。 任何build议如何解决这个问题?

当一个未被捕获的exception发生时,你处于一个不洁的状态。 让进程死亡并重新启动,没有其他任何事情可以安全地将其恢复到已知状态。 forever使用,它会尽快重新开始你的过程。

使用try / catch / finally。

 app.get('/hang', function(req, res, next) { console.log("In /hang route"); setTimeout(function() { console.log("In /hang callback"); try { if(reqNum >= 3) throw new Error("Problem occurred"); } catch (err) { console.log("There was an error", err); } finally { res.send("It worked!"); } }, 2000); });