はじめに
前回は、Node.jsについての説明から、モジュール参照の仕組みや最もシンプルなHTTPサーバの実装についてまで紹介しました。今回はパッケージ管理ツールのnpmとNode.jsアプリケーションの永続化について紹介します。前回記事に引き続く内容になっていますので、未読の際はそちらからなるべくご覧ください。
予期せぬ例外に備える
前回の記事で、どんなリクエストにも「Hello World」を出力するだけの、単純なHTTPサーバの実装を紹介しました。そして、アプリケーションとそれを動作させるHTTPサーバがJavaやPHPなどと異なり、オールインワンの1つのプロセスで動くことも述べました。
このため、単にnode app.jsのように動作させた場合、例外が発生すると、サーバ機能ごとプロセスが終了してしまいます。そのため、サーバ機能まで道連れにしないように、アプリケーション側で例外処理をきちんと実装しておく必要があります。
前回のサンプルコードにちょっと細工をしてみましょう。
変数nをアクセスごとにカウントアップして出力します。5回目で宣言していない変数aを参照しようとして例外が発生します。
node app.jsで起動して実際にブラウザで何度かリロードするとプロセスが止まることがわかると思います(もしも予想より早く止まったとしたら、それはブラウザが/favicon.icoを自動で取得していたからでしょう)。
これでは実際に運用するサービスには使えないと思ってしまうかもしれませんが、そのためにデーモン化するツールは、すでにいくつか存在します。今回はプロセスを維持するためのツールforever (を試してみます。
Node向けパッケージ管理ツールnpm
foreverのインストールの前にパッケージ管理ツールの説明をしたいと思います。nodeではすでに多くのライブラリパッケージが(主にGitHubで)公開されています。そして多くのパッケージはnpmという専用のパッケージ管理ツールを使って、簡単に導入することができます。http://search.npmjs.org/を見るとたくさんのライブラリがnpmに登録されていることがわかります。
このnpm、もともとはnode本体とは別のツールでしたが、最近のバージョンから標準でnodeとともにインストールされます。
先ほどのforeverもこのnpmで提供されています。コマンドラインで次を実行します。
オプションの「-g」はグローバルインストールの意で、npmのインストール場所にパッケージをインストールします。付けない場合は、カレントディレクトリのnode_modules内にインストールされます。
個別のアプリケーションでしか利用しないライブラリモジュールなどはオプションなしでインストールしましょう。
またnpmは、インストール対象のパッケージが依存しているライブラリも必要に応じて、まとめてインストールしてくれます。
現在インストールしているパッケージの一覧を見たいときは、listコマンドで行います。
アンインストールしたいときは、uninstallコマンドで行います。
いずれも「-g」オプションでグローバルかカレントディレクトリかの切り替えができます。他にも様々な機能がnpmを通して使えます。
foreverを用いて継続して動作させる
foreverは、モジュールとともにコマンドも同時に提供してくれます。今回はこちらで試してみましょう。
を実行すると、foreverがnodeプロセスを起動して例外が起きても再起動してくれます。
もう一度先ほどと同様に、ブラウザからアクセスして試してください。resultの値が何度やると、1に戻ると思います。これはnodeが再実行されているためです。
停止するには次にようにします。
なお、Windows上ではforeverは動作しないようなのでMac, Linuxでお試しください。
Node.jsとパッケージのアップデート
先日、Node.js 0.6.16までのバージョンにHTTPヘッダの解析処理に脆弱性があることが発表されました。
Node.js自体のアップデートは上書きインストールで構いません。パッケージのアップデートは、こちらもnpmコマンドから簡単に行うことができます。
Node.jsはまだ新しいプロジェクトなので、利用する側も迅速にアップデートに対応していく必要があります。
最後に
前回と今回で、Node.jsの基礎と、基本的な仕組みや使い方について紹介してきました。次回からは、実際にWebアプリケーションをNode.jsで作っていきたいと思います。フレームワークExpressを使って、その先のMongoDBとの連携も視野に入れて、組んでいきます。