Восстановление из Uncaught Exception в Node.JS - PullRequest
19 голосов
/ 14 ноября 2011

ОК, поэтому у меня проблема.Если во время обработки 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);

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

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

Ответы [ 3 ]

15 голосов
/ 14 ноября 2011

Когда возникает неперехваченное исключение, вы находитесь в нечистом состоянии.Позвольте процессу умереть и перезапустить его, вы ничего не можете сделать, чтобы безопасно вернуть его в заведомо хорошее состояние.Используйте forever, он перезапустит ваш процесс, как только умрет.

1 голос
/ 22 января 2019

Если ошибка генерируется синхронно, экспресс не перестает работать, возвращая только 500.

this.app.get("/error", (request, response) => {
  throw new Error("shouldn't stop");
});

Если ошибка генерируется асинхронно, экспресс завершается сбоем.Но согласно официальной документации , есть способ восстановить ее, позвонив по номеру next:

this.app.get("/error", (request, response, next) => {
  setTimeout(() => {
    try {
      throw new Error("shouldn't stop");
    } catch (err) {
      next(err);
    }
  }, 0);
});

. Это позволит Express выполнить свою обязанность по ответу с ошибкой 500..

0 голосов
/ 14 ноября 2011

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