サーバーサイドローカル環境同期・非同期

【Node.js】 終了を検知して後処理をおこなう方法

更新日:2021/06/08

JavaScriptは元々ブラウザでの動作を想定しているので、言語仕様として終了時の処理が定義されていません。
しかしNode.jsでは、プログラム終了時に後処理をおこないたいケースがあります。

そこで、Node.jsでの終了処理の方法をお伝えします。

 

Node.jsの終了を検知するコード例

Node.jsの終了イベントは、次のコードで補足できます。


process.on("exit", exitCode => {
   // 後始末処理
});
process.on("SIGINT", ()=>process.exit(0));

一つ目のprocess.onはexitイベント発生時に呼び出されるコールバック関数を登録しています。
exitイベントは、コードが終了したときに発生します。
終了には、コードの処理が非同期を含めて完了したときや、process.exitの呼び出し、例外が含まれます。

Ctrl+cで終了した時にexitイベント発生は発生しません。
その代わりに、SIGINTシグナルが生成されます。
二つ目のprocess.onは、SIGINTシグナルを補足しています。

通常SIGINTシグナルをNode.jsが受け取るとプログラムが終了しますが、リスナーを登録すると終了しなくなります。
そこでprocess.exitの呼び出し、一つ目のexitイベントを発生させ、後始末の処理とプログラムの終了をおこなっています。

exitイベントは、終了することを通知するイベントなので、終了をキャンセルすることができません。

 

終了時に非同期処理をおこなう

コード内で登録された非同期処理が全て終わると、プログラムは終了します。

終了前に処理を行いたいときはexitイベントを補足すればいいのですが、非同期処理を行いたい場合はexitイベントを利用できません。

そこで、exitイベントの代わりにbeforeExitイベントを使用します。

beforeExitイベントの補足


process.on("beforeExit" , exitCode => {
  // 非同期処理の登録
});

注意点は、非同期処理が解決したら再度beforeExitイベントが発生する点です。
つまり、フラグなどで管理しないと、プログラムが終わらなくなります。

beforeExitイベントを一回だけ処理する


let beforeExitCatched = false;

process.on("beforeExit" , exitCode => {
    if( beforeExitCatched ) return;
    beforeExitCatched = true;

  // 非同期処理の登録
});

beforeExitイベントは、process.exitでの終了や、例外発生での終了を補足しません。

更新日:2021/06/08

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。