以下是一个例子:
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);
如果您访问/错误,则会发生异常,但会被捕获。用户收到错误消息 - 没问题。但是,如果我访问/挂起,服务器最终将抛出未捕获的异常并永久挂起。任何后续的/ hang请求都会挂起。
这很糟糕。有关如何解决此问题的任何建议吗?
答案 0 :(得分:15)
当发生未捕获的异常时,您处于不洁净状态。让进程死掉并重新启动它,没有别的办法可以让它安全地恢复到已知状态。使用forever
,它会在消失后立即重启。
答案 1 :(得分:1)
如果同步引发错误,Express不会停止工作,只会返回500。
this.app.get("/error", (request, response) => {
throw new Error("shouldn't stop");
});
如果异步引发错误,则express将崩溃。但是根据它的official documentation,仍然可以通过调用next
从其中恢复:
this.app.get("/error", (request, response, next) => {
setTimeout(() => {
try {
throw new Error("shouldn't stop");
} catch (err) {
next(err);
}
}, 0);
});
这将使express响应500错误进行响应。
答案 2 :(得分:0)
使用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);
});