socket.ioの習作解説その壱

習作のサーバ側、app.jsの最初の5行で静的WEBサーバを立ててます。

//サーバ側
var express = require('express');
var app = express();
app.use(express.favicon());
app.use(express.static(require('path').join(__dirname, 'public')));
var server = require('http').createServer(app).listen(3000);

まずはappを作ってセットアップ。faviconの対応はexpress.favicon()を設定。expressが前提としているconnectライブラリでミドルウェアと呼ばれているものですが、なじみの世界の言葉で言えば、Apacheモジュールですね。こいつはApacheワールドだったらmod_faviconとでも言われるようなものだと。続いてmod_staticならず、express.static()をセットアップしますが、上記のコードでapp.jsを置くディレクトリの直下のpublicをドキュメントルートとする静的WEBサーバになりました。ここで__dirnameはおまじないで、実行するスクリプトのpwdにアクセスするユーティリティです。
require('http').createServer()にappを渡すとサーバが完成。ソースコード読んでみると引数は「request」イベントのハンドラオブジェクトでした。つまりexpress()の結果たるappオブジェクトはルートハンドラオブジェクト。
listenでサーバを上げますが、Node.js v0.10.x以降ではユーザースクリプトが全部実行され、次にprocess.nextTick()を全展開した後で初めてI/Oイベントが発生するということですから、実際はまだ上がらない。よって変数の参照スコープの都合で前後するもの以外はどういう順番でも大体OK。このサンプルでも、app.jsの再末尾にapp.use(express...)の二行を持っていっても等価に動きます。Java屋さん的には超気持ち悪いですけどね!listenしたらすぐI/O受付のイベントループスレッドが始まることから、その後に動的にセットアップを変えるのは御法度な作りにしたくなるところですが、Node.jsは単一のループで全部やってますので。
ここまでで、WEBサーバとしては素のApache HTTPDぐらい(さすがにウソ?)動きます。静的な企業プロファイルサイトぐらいだったら例外処理をやってないし、セキュリティ脆弱性も怪しいけど、大体OK。