як правильно закрити 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();.

Відповіді:


114

app.listen()повертається http.Server. Вам слід викликати close()цей екземпляр, а не appінстанцію.

Напр.

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
Дивно, але він не закривається, якщо я отримую доступ до якогось маршруту.
Uday Hiwarale

1
@Uday, я теж це пережив. Я виявив, що в моєму браузері було відкрито постійне з'єднання HTTP1.1, тому, коли я натиснув F5, здавалося, що сервер не закрився. Якщо ви спробуєте інший браузер, ви побачите, що сокет сервера не працює.
Рік Вельде,

Це була моя помилка, я закликав близько, appа не server. Врятував мій день. Велике спасибі 👍
Едісон Спенсер

48

У Express v3 вони видалили цю функцію.

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

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

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


Використовуйте щось на зразок github.com/gajus/http-terminator, щоб забезпечити припинення роботи сервера на випадок постійних з'єднань або запитів, які не дають відповіді.
Гаджус

коротко і просто
крупеш Анадкат

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-термінатора полягає в тому, що:

  • це не мавпа-патч Node.js API
  • він негайно знищує всі сокети без вкладеного HTTP-запиту
  • це дозволяє витончений час очікування для сокетів з поточними HTTP-запитами
  • він належним чином обробляє з'єднання HTTPS
  • він інформує з'єднання за допомогою "Keep-Live" про те, що сервер вимикається, встановлюючи з'єднання: закрити заголовок
  • він не припиняє процес Node.js

дякую за відповідь, але цьому питанню 7 років
Володимир Старков

7
Це залишається слушним питанням.
Гаджус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.