2012-12-07

[Express] static と directory を組み合わせて使う

正確には Express というより connect についての話です。staticdirectory を使ってあるディレクトリの中を全て公開するような設定の仕方について考えます。

このように書くと http://localhost:3000/some/directory への要求は static によって http://localhost:3000/some/directory/ へのリダイレクトになり、index.html があればその内容が static により返され、無ければ次のミドルウェアに fallback して directory によるファイル一覧が返ります。

Apache 風の動作はこちらが該当します。

var express = require('express'),
    app = express();

app.use(express.static('/path_to_dir'));
app.use(express.directory('/path_to_dir'));
app.listen(3000);

一方でこのように先ほどとは逆順でミドルウェアを追加すると、http://localhost:3000/some/directory と http://localhost:3000/some/directory/ の返答は必ず directory によるファイル一覧になり、index.html があっても返りません。

ソースツリーをそのまま公開したい場合など index.html ではなくファイル一覧が出てほしい場合はこっちのコードが役に立つかもしれません。

var express = require('express'),
    app = express();

app.use(express.directory('/path_to_dir'));
app.use(express.static('/path_to_dir'));
app.listen(3000);

static について、ディレクトリが trailing slash 付きでリクエストされたとき自動的に index.html を探す動作は send というライブラリが行っています。

水面下での動作が気になる人は express, connect, send で活用されている debug によるデバッグ出力を環境変数 DEBUG を * に設定することで有効にできます。

$ env DEBUG='*' node app.js