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();.

Vladimir Starkov
źródło

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

Vladimir Kuznetsov
źródło
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,
48

W express v3 usunęli tę funkcję.

Nadal możesz osiągnąć to samo, przypisując wynik app.listen()funkcji i stosując go blisko:

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

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

Michael
źródło
Użyj czegoś takiego jak github.com/gajus/http-terminator, aby zapewnić zakończenie serwera w przypadku trwałych połączeń lub żądań, które nie generują odpowiedzi.
Gajus
krótkie i proste
krupesh Anadkat
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.');
  });
});
Neha Sharma
źródło
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.
Gajus
źródło
dziękuję za odpowiedź, ale to pytanie ma 7 lat
Vladimir Starkov
7
Pozostaje ważne pytanie.
Gajus