ノードプロセスを終了する前にすべての接続を適切に閉じるために私が作業しているアプリケーションのExpress.jsベースのサーバが必要ですシャットダウン信号(SIGTERMまたはSIGINT)が送信されたときに発生します。正常にノード+ Expressアプリケーションをシャットダウンできません(ノードのhttpサーバのクローズ機能が完了しません)
は私がexpress-graceful-shutdown
ミドルウェア(which is really simple)をわずかに変更されているので、次のように私のコードの関連部分は約になります。
server.js
import gracefulShutdown from './tools/graceful-shutdown';
const server = app.listen(config.port,() => {
console.log(`Server is running`);
});
app.use(gracefulShutdown(server));
優雅な-shutdown.js:
function gracefulShutdownMiddleware(server) {
let shuttingDown = false;
const forceTimeout = 10 * 1000; // giving the app 10 seconds to shutdown gracefully
process.on('SIGTERM', gracefulExit); // listen for TERM signal (e.g. kill)
process.on ('SIGINT', gracefulExit); // listen for INT signal (e.g. Ctrl-C)
function gracefulExit() {
if (shuttingDown) return;
shuttingDown = true;
console.log('Received kill signal (SIGTERM), shutting down');
setTimeout(function() {
console.log('Could not close connections in time, forcefully shutting down');
process.exit(1);
}, forceTimeout);
server.close(function() {
console.log('Closed out remaining connections.');
process.exit();
});
}
function middleware(req, res, next) {
if (!shuttingDown) return next()
res.set('Connection', 'close')
res.status(503).send('Server is in the process of restarting.')
}
return middleware
}
export default gracefulShutdownMiddleware;
私は問題ですこれを観察する。ノードサーバーが起動した直後にノードサーバーをシャットダウンすると、期待通りにシャットダウンされます(関数gracefulExit
はミドルウェアで正常に動作します)、server.close
が正常に実行され、server.close
へのコールバックがコンソールメッセージを出力します。しかし、ブラウザを開いて実際にローカルホスト上の自分のアプリケーションにアクセスして、サーバが何らかの作業をしてからサーバをシャットダウンしようとすると、server.close関数が終了しないように見えます最終的にはsetTimeoutは独自のコールバックを呼び出して、強制的にアプリをシャットダウンするまで。
server.close関数は、ノードのlibからthis functionです。
あなたは私がなぜノードサーバのclose
機能を見つけ出す助けてもらえprocess.exit
でコールバックを呼び出し完了しない可能性がありますか?
[プロセスが終了したときにExpress Serverを正常にシャットダウンするにはどうすればよいですか?](https://stackoverflow.com/questions/43003870/how-do-i-shut-down-my-express-サーバーが正常に処理された場合) –
上記の問題と同じ問題が発生しています。私の答えもチェックしてください(https://stackoverflow.com/a/44291800/1056679)。 –