как правильно закрыть сервер node-express?

84

Мне нужно закрыть сервер после получения обратного вызова с /auth/github/callback URL-адреса. С обычным сервером закрытия HTTP API в настоящее время поддерживается server.close([callback]) функция API, но с сервером node-express я получаю сообщение 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 выразить близко ... но я не уверен , если я могу использовать его с кодом у меня есть: var app = express();.

Владимир Старков
источник

Ответы:

115

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

Владимир Кузнецов
источник
4
Странно, он не закрывается, если я попадаю на какой-то маршрут.
Удай Хиварале
1
@Uday, я тоже такое испытал. Я обнаружил, что в моем браузере открыто постоянное соединение HTTP1.1, поэтому, когда я нажал F5, казалось, что сервер не закрывается. Если вы попробуете другой браузер, вы увидите, что сокет сервера не работает.
Рик Велде
Это была моя ошибка, я звонил ближе, appа не server. Спас мой день. Большое спасибо 👍
Эдисон Спенсер
48

В экспресс v3 эту функцию убрали.

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

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

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

Майкл
источник
Используйте что-то вроде github.com/gajus/http-terminator, чтобы гарантировать завершение работы сервера в случае наличия постоянных соединений или запросов, не дающих ответа.
Gajus
коротко и просто
крупеш Анадкат
4

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

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.');
  });
});
Неха Шарма
источник
извините, это не актуально. Вопрос касается ручного выключения сервера, а не обработки ошибок
Владимир Старков
1

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

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

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

  • это не обезьяна-патч Node.js API
  • он немедленно уничтожает все сокеты без прикрепленного HTTP-запроса
  • он позволяет плавно отключать сокеты с текущими HTTP-запросами
  • он правильно обрабатывает HTTPS-соединения
  • он сообщает соединениям, использующим keep-alive, что сервер выключается, устанавливая заголовок connection: close
  • он не завершает процесс Node.js
Gajus
источник
спасибо за ответ, но этому вопросу 7 лет
Владимир Старков
7
Остается актуальный вопрос.
Gajus