Мне нужно закрыть сервер после получения обратного вызова от /auth/github/callback URL-адрес. При обычном HTTP API закрытие В настоящее время сервер поддерживает server.close([callback]) API-функция, но с нод-экспресс-сервером я получаю TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close' ошибка. И я не знаю, как найти информацию для решения этой проблемы.
Как мне закрыть экспресс-сервер?

Замечания по конфигурации NodeJS:

$ node --version
v0.8.17
$ npm --version
1.2.0
$ npm view express version
3.0.6

Фактический код заявки:

var app = express();

// configure Express
app.configure(function() {
    // … configuration
});

app.get(
    '/auth/github/callback',
    passport.authenticate('github', { failureRedirect: '/login' }),
    function(req, res) {
        res.redirect('/');

        setTimeout(function () {
            app.close();
            // TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close'
        }, 3000)
    }
);

app.listen('http://localhost:5000/');

Кроме того, я обнаружил 'nodejs express close…' но я не уверен, что смогу использовать его с моим кодом: var app = express();.

84
Vladimir Starkov 25 Янв 2013 в 09:34

4 ответа

Лучший ответ

app.listen() возвращает http.Server. Вы должны вызывать close() для этого экземпляра, а не для app.

Ex .

app.get(
    '/auth/github/callback',
    passport.authenticate('github', { failureRedirect: '/login' }),
    function(req, res) {
        res.redirect('/');

        setTimeout(function () {
            server.close();
            // ^^^^^^^^^^^
        }, 3000)
    }
);

var server = app.listen('http://localhost:5000/');

Вы можете проверить источники: /node_modules/express/lib/application.js

91
Vladimir Kuznetsov 25 Янв 2013 в 05:59

Я много раз отвечал на вопрос «как завершить работу HTTP-сервера» на разных поддерживают каналы. К сожалению, я не могу порекомендовать ни одну из существующих библиотек, поскольку в них не хватает так или иначе. С тех пор я собрал пакет, который (я считаю) обрабатывает все ожидаемые случаи завершения работы HTTP (S) сервера graceful express.js.

https://github.com/gajus/http-terminator

Основное преимущество http-terminator заключается в том, что:

  • это не monkey-patch API Node.js
  • он сразу уничтожает все сокеты без прикрепленного HTTP-запроса
  • это позволяет изящный таймаут сокетам с текущими запросами HTTP
  • он правильно обрабатывает HTTPS-соединения
  • он сообщает соединениям, используя keep-alive, что сервер выключается, устанавливая соединение: close header
  • он не завершает процесс Node.js
0
Gajus 20 Янв 2020 в 03:15

Если в вашем приложении Express возникает какая-либо ошибка, вам необходимо закрыть сервер, и вы можете сделать это, как показано ниже:

var app = express();
var server = app.listen(process.env.PORT || 5000)

Если произойдет какая-либо ошибка, наше приложение получит сигнал с именем SIGTERM

Вы можете прочитать больше о сигнале узла здесь-

https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html

process.on('SIGTERM', () => {
  console.info('SIGTERM signal received.');
  console.log('Closing http server.');
  server.close(() => {
    console.log('Http server closed.');
  });
});
0
Neha Sharma 1 Июл 2019 в 12:05

В Express v3 они убрали эту функцию.

Вы все еще можете достичь того же самого, назначив результат функции app.listen() и применив к нему близкое значение:

var server = app.listen(3000);
server.close()

https://github.com/visionmedia/express/issues/1366

42
Michael 12 Фев 2014 в 20:52