はじめに
前回は,Node.jsについての説明から,モジュール参照の仕組みや最もシンプルなHTTPサーバの実装についてまで紹介しました。今回はパッケージ管理ツールのnpmとNode.jsアプリケーションの永続化について紹介します。前回記事に引き続く内容になっていますので,未読の際はそちらからなるべくご覧ください。
予期せぬ例外に備える
前回の記事で,どんなリクエストにも「Hello World」を出力するだけの,単純なHTTPサーバの実装を紹介しました。そして,アプリケーションとそれを動作させるHTTPサーバがJavaやPHPなどと異なり,オールインワンの1つのプロセスで動くことも述べました。
このため,単にnode app.jsのように動作させた場合,例外が発生すると,サーバ機能ごとプロセスが終了してしまいます。そのため,サーバ機能まで道連れにしないように,アプリケーション側で例外処理をきちんと実装しておく必要があります。
前回のサンプルコードにちょっと細工をしてみましょう。
var n = 0;
var http = require('http');
http.createServer(function (req, res) {
if (++n > 4) { a }
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end("result:" + n);
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');
変数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コマンドで行います。
npm uninstall [-g] <パッケージ名>
いずれも「-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との連携も視野に入れて,組んでいきます。