node-expressサーバーを適切に閉じる方法は?


84

/auth/github/callback URLからコールバックを取得した後、サーバーを閉じる必要があります。通常のHTTPAPIクロージングサーバーでは、現在server.close([callback]) API関数をサポートしていますが、node-expressサーバーではTypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close' エラーが発生します。そして、私はこの問題を解決するための情報を見つける方法がわかりません。
Expressサーバーを閉じるにはどうすればよいですか?

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 expressclose…」を見つけましたが、次のコードで使用できるかどうかわかりませんvar app = express();

回答:


115

app.listen()を返しますhttp.Serverclose()インスタンスではなく、そのインスタンスで呼び出す必要があり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 2016

1
@Uday、私もこれを経験しました。ブラウザでHTTP1.1永続接続が開いていることがわかったので、F5キーを押すと、サーバーが閉じていないように見えました。別のブラウザを試してみると、サーバーソケットが実行されていないことがわかります。
Rick Velde 2016

それは私の間違いでした、私はの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のようなものを使用して、永続的な接続または応答を生成しない要求がある場合にサーバーを確実に終了させます。
ガジュス

短くてシンプル
krupeshAnadkat20年

4

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

申し訳ありませんが、関係ありません。質問はサーバーの手動シャットダウンに関するものであり、エラー処理に関するものではありません
VladimirStarkov19年

1

「HTTPサーバーを終了する方法」のバリエーションに何度も答えました。 サポートチャネル。残念ながら、既存のライブラリは何らかの形で不足しているため、お勧めできませんでした。それ以来、私は(私が信じる)優雅なexpress.js HTTP(S)サーバーの終了に期待されるすべてのケースを処理するパッケージをまとめました。

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

http-terminatorの主な利点は次のとおりです。

  • Node.jsAPIにモンキーパッチを適用しません
  • HTTPリクエストが添付されていないすべてのソケットを即座に破棄します
  • 進行中のHTTPリクエストでソケットに適切なタイムアウトを許可します
  • HTTPS接続を適切に処理します
  • キープアライブを使用して、接続を設定することでサーバーがシャットダウンしていることを接続に通知します。ヘッダーを閉じる
  • Node.jsプロセスは終了しません

回答ありがとうございますが、この質問は7歳です
ウラジミールスターコフ

7
それは有効な質問のままです。
ガジュス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.