jak poprawnie zamknąć serwer node-express?


84

Muszę zamknąć serwer po otrzymaniu oddzwaniania z /auth/github/callback adresu URL. W przypadku zwykłego serwera zamykającego HTTP API obecnie obsługuje server.close([callback]) funkcję API, ale w przypadku serwera node-express otrzymuję TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close' błąd. I nie wiem, jak znaleźć informacje, aby rozwiązać ten problem.
Jak zamknąć serwer ekspresowy?

Uwagi dotyczące konfiguracji NodeJS:

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

Rzeczywisty kod aplikacji:

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

Również znalazłem „nodejs wyrazić blisko ...” ale nie mam pewności, czy mogę używać go z kodem mam: var app = express();.

Odpowiedzi:


115

app.listen()zwraca http.Server. Powinieneś wywołać close()tę instancję, a nie appinstancję.

Dawny.

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

Możesz sprawdzić źródła: /node_modules/express/lib/application.js


4
Dziwne, nie zamyka się, gdy wchodzę na jakąś trasę.
Uday Hiwarale

1
@Uday, ja też tego doświadczyłem. Dowiedziałem się, że moja przeglądarka ma otwarte trwałe połączenie HTTP1.1, więc kiedy nacisnąłem F5, wyglądało na to, że serwer się nie zamyka. Jeśli spróbujesz innej przeglądarki, zobaczysz, że gniazdo serwera nie działa.
Rick Velde

To był mój błąd, appzamiast tego dzwoniłem blisko server. Uratowałem mój dzień. Wielkie dzięki 👍
Edison Spencer,


4

Jeśli w twojej aplikacji ekspresowej wystąpi jakikolwiek błąd, musisz zamknąć serwer i możesz to zrobić jak poniżej:

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

Jeśli wystąpi jakikolwiek błąd, wówczas nasza aplikacja otrzyma sygnał o nazwie SIGTERM

Możesz przeczytać więcej o sygnale węzła tutaj-

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.');
  });
});

przepraszam, to nie dotyczy. Pytanie dotyczy ręcznego wyłączania serwera, a nie obsługi błędów
Vladimir Starkov

1

Wiele razy odpowiadałem na różne warianty „jak zakończyć działanie serwera HTTP” kanały wsparcia. Niestety nie mogłem polecić żadnej z istniejących bibliotek, ponieważ w jakiś sposób im brakuje . Od tego czasu stworzyłem pakiet, który (jak sądzę) obsługuje wszystkie przypadki oczekiwane od pełnego wdzięku zakończenia serwera HTTP (S) express.js.

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

Główną zaletą terminatora http :

  • nie naprawia małpy API Node.js.
  • natychmiast niszczy wszystkie gniazda bez dołączonego żądania HTTP
  • pozwala na bezpieczne przekroczenie limitu czasu do gniazd z trwającymi żądaniami HTTP
  • poprawnie obsługuje połączenia HTTPS
  • informuje połączenia za pomocą funkcji keep-alive, że serwer jest zamykany przez ustawienie connection: close header
  • nie kończy procesu Node.js.

dziękuję za odpowiedź, ale to pytanie ma 7 lat
Vladimir Starkov

7
Pozostaje ważne pytanie.
Gajus
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.