Express.js の終了処理 - Express

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):異常終了を意味します