Express.js の終了処理
Express.js 終了する処理についてきさいします。
Express-generator で作成されたスケルトンの場合、サーバーの起動処理がbin/wwwに記述されています。
bin/wwwに終了処理を記述します。
以下のコードは、Mysql2 でプール接続した場合、アプリの終了時にpoolを終了するコードです。
// `SIGINT` (Ctrl+C) をキャッチし、アプリ終了時に接続プールを閉じる
process.on('SIGINT', async () => {
console.log('アプリを終了します...');
await pool.end();
process.exit(0);
});
process.on('exit', async () => {
console.log('プロセスが終了します...');
await pool.end();
});
Windows を利用している場合、Ctr+C で終了した場合、サーバーを停止します...が表示される前に、バッチ ジョブを終了しますか (Y/N)?が表示される場合は、以下の内容が考えられます。
Windows の PowerShell や Git Bash で動作している場合に、プロセス終了時の確認メッセージが出るからかもしれません。
// サーバー停止時の処理
server.on('close', async () => {
console.log('サーバーを停止します...');
});
// SIGINT (Ctrl+C) を検知して `server.close()` を実行
process.on('SIGINT', async () => {
console.log('アプリを終了します...');
server.close(); // `close` イベントが発生する
process.exit(0);
});
上記のコードをうまくいかない場合は、以下のようにコードを変更してください。
// `SIGINT` (Ctrl+C) をキャッチして `server.close()` を実行
process.on('SIGINT', async () => {
console.log('アプリを終了します...');
// Mysq2 でプール接続した接続を終了するには、「 bin/www 」に以下を記載します。
// await pool.end();
server.close(() => {
console.log('サーバーを停止しました。');
process.exit(0); // `server.close()` の処理完了を待ってから終了
});
});
アプリが予期せず終了した場合のため、以下の内容も追加しておきます。
process.on('uncaughtException', async (err) => {
console.error('予期せぬエラーが発生しました:', err);
await pool.end(); // 接続プールを閉じる
process.exit(1); // エラーコード 1 で終了
});
- process.exit(0):正常終了を意味します
- process.exit(1):異常終了を意味します