6

Express 3 では、プロセスが存在する場合にデータベース接続を閉じる処理をどのように処理しますか?

HTTP サーバーの呼び出し.on('close', ...を明示的に使用しない限り、イベントは発行されません。.close()

これまでのところ、これは私が来た最も近いものですが、process.on代わりに使用しますserver.on:

process.on('SIGTERM', function () {
   // Close connections.
   process.exit(0);
});
4

1 に答える 1

10

からの情報に基づく:

--

var express = require('express');

var app = express();
var server = app.listen(1337);
var shutting_down = false;

app.use(function (req, resp, next) {
 if(!shutting_down)
   return next();

 resp.setHeader('Connection', "close");
 resp.send(503, "Server is in the process of restarting");
 // Change the response to something your client is expecting:
 //   html, text, json, etc.
});

function cleanup () {
  shutting_down = true;
  server.close( function () {
    console.log( "Closed out remaining connections.");
    // Close db connections, other chores, etc.
    process.exit();
  });

  setTimeout( function () {
   console.error("Could not close connections in time, forcing shut down");
   process.exit(1);
  }, 30*1000);

}

process.on('SIGINT', cleanup);
process.on('SIGTERM', cleanup);

Connection: closeヘッダーは、次に HTTP 要求を送信するときに接続を閉じるように指示するために使用されますkeep-alive。詳細はこちら: http://www.jmarshall.com/easy/http/#http1.1s4

接続を閉じる他の方法があるかどうかはわかりませんkeep-alivekeep-alive接続が閉じられない限り、ノード プロセスはハングします。デフォルトのアイドル タイムアウトは 2 分です。より詳しい情報。node.jskeep-aliveタイムアウトについて (タイムアウトの変更を含む): nodejs サーバーで HTTP Keep-Alive タイムアウトを設定する方法

于 2012-11-19T00:14:51.473 に答える