NodeJSでWebサーバーを立てると
フロントエンドでJavaScriptやTypeScriptを使っていると、バックエンドもJavaScriptで書きたいなと思うことが多く、私が担当するWeb系のプロジェクトではお客さんから指定がない限りはWebアプリケーションサーバーはNodeJSを使っています。
NodeJSでExpressとかを使ってWebサーバーを立てると、エラーが生じると
node main.js
Code language: DOS .bat (dos)
のプロセスが落ちてしまうんですよね。
追加するエラーハンドル
私の場合、最初の概念実証(PoC)のときは、NodeJSのプログラムも正常処理ぐらいしか書いていなくて、PoCがうまくいき実際にWebアプリケーションを実装する段階になってエラーハンドルを追加していくのですが、お客さんのほうも土日とか夜間にWebサーバーが止まっても対応できないので、NodeJSのプロセスが落ちることだけは回避するようにしたいと依頼します。
try/catchは使っているのに…
なので、ファイルアップロードとか、ファイル名変更とか、エラーが発生する可能性があるところには、極力try/catchでエラーハンドルを入れて、エラーが起きてもNodeJSのプロセスが落ちないようにプログラム側で工夫するのですが、どうしてもそれをくぐり抜けてしまうことがあり、そうすると
node main.js
Code language: DOS .bat (dos)
のプロセスが落ちてしまいます。NodeJSのプログラムだけで対応することに難しさを感じていました。
プロセス管理ツールpm2
そこで調べてみると、プロセス管理ツールのpm2(npm)が使えそうということに行き着きました。
npmを使ったインストール
NodeJSのパッケージ管理npmを使ってpm2をインストールすることができます。後にpm2コマンドをどのフォルダにいても使用できるようにするため、グローバルオプション(-g)を付けてインストールします。
npm install pm2 -g
Code language: DOS .bat (dos)
すると、ターミナルやコマンドプロンプトから
pm2
Code language: DOS .bat (dos)
コマンドが使用できるようになります。
pm2でNodeJSのWebサーバーを起動
pm2でnode main.jsを実行するには
pm2 start main.js
Code language: DOS .bat (dos)
と実行します。これにより、NodeJSはデーモンとしてバックエンドで実行されるので、ターミナルやコマンドプロンプトのリターンも返ってきます。
この状態でNodeJSのプロセスが落ちるようなテストを実行しても、pm2では処理が継続されます。これです、求めていたのは。
pm2でNodeJSのWebサーバーを停止
一方で、pm2からだとデーモンでNodeJSのプロセスが実行されるので、Ctrl+Cで止めることができなくなります。
pm2では任意のフォルダからデーモンを終了させることができます。例えば、pm2 start main.jsを実行すると、「main」というアプリ名で実行されますので、「pm2 stop アプリ名」で以下のようなコマンドで終了できます。
pm2 stop main
Code language: DOS .bat (dos)
NodeJSのダウンは無くなっても…
pm2を使い始めてから、NodeJSがダウンすることが無くなったので一安心しましたが、ただ、pm2に任せていると処理がどこで失敗しているのかが分かりづらくなります。やはりプログラム側で処理のレスポンスやエラーメッセージを定義するところは必要なんだなと思います。
No responses yet