exception - handling - Recuperarse de una excepción no detectada en Node.JS
node express use (2)
OK, entonces tengo un problema. Si se produce una excepción no detectada mientras estoy manejando una solicitud HTTP, no tengo oportunidad de llamar al método end () en el objeto http.ServerResponse. Por lo tanto, el servidor se cuelga para siempre y nunca cumple con la solicitud.
Aquí hay un ejemplo:
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);
Si visita / error, se produce una excepción, pero está atrapada. El usuario recibe un mensaje de error, no hay problema. Sin embargo, si visito / cuelgo, el servidor arrojará una excepción no detectada y se bloqueará para siempre. Cualquier solicitud posterior de / hang se bloqueará.
Esto apesta. ¿Algún consejo sobre cómo solucionar este problema?
Cuando ocurre una excepción no detectada, estás en un estado sucio. Deje que el proceso muera y reinícielo, no hay nada más que pueda hacer para devolverlo de manera segura a un estado conocido. Úselo forever
, reiniciará su proceso tan pronto como muera.
Utilice 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);
});