Восстановление из Неперехваченного исключения в узле.JS

ОК, так что у меня проблема. Если при обработке HTTP-запроса возникает неперехваченное исключение, у меня нет возможности вызвать метод end() на http.Объект ServerResponse. Таким образом сервер зависает навсегда и никогда не выполняет запрос.

вот пример:

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

при посещении /error возникает исключение, но оно перехватывается. Пользователь получает сообщение об ошибке - нет проблем. Если я посещаю /зависаю, сервер в конечном итоге бросит непойманное исключение и висеть вечно. Любые последующие запросы /hang будут висеть.

фтопку. Любые советы о том, как исправить эту проблему?

2 ответа:

когда происходит неперехваченное исключение, вы находитесь в нечистом состоянии. Пусть умирают и перезапустить его, нет ничего, что вы можете сделать, чтобы благополучно вернуть ее в хорошем состоянии. Используйте 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);
});