expressのconfigure()は、なにをしているのか。
GUIDEを読んでもよくわからなかったので、ソースコードにあたってみました。
今現在、masterは2.x系の次のバージョンになっているらしく、2.x系とは構成も結構変わっているみたいですが、configureに関しては変更が入っていないようですので、2.xブランチの最新から該当箇所を見てみます。
2.x系ではhttp.jsに当該コードが入っています。
コピーすると
app.configure = function(env, fn){ var envs = 'all' , args = toArray(arguments); fn = args.pop(); if (args.length) envs = args; if ('all' == envs || ~envs.indexOf(this.settings.env)) fn.call(this); return this; };
つまり、this.settings.env(環境変数NODE_ENVからセットされる。NODE_ENVが定義されていなければdevelopmentとなる)と同じ文字列が、第一引数に指定されているかをチェックして、同じだったら第二引数の関数を呼び出すというシンプルな処理です。
ここで不思議なのが、GUIDEの When configure() is called without an environment name it will be run in every environment prior to the environment specific callback.
という記述。 prior to the environment specific callback
は嘘なんじゃないのということ。「各環境固有のコールバックが呼ばれる前に、全環境共通のconfigureが実施される」ように読めるんだけど、その場で即コールバックを読んでいるので、そんな前後関係は考慮していない様に見える。
実際にコードを実行してみる。
var express = require('express'); var app = express.createServer(express.logger()); console.log(process.env.NODE_ENV); app.configure('development', function() { console.log('configure for development'); }); app.configure('production', function() { console.log('configure for production'); }); app.configure(function() { console.log('configure for all'); }); app.listen(3000);
これでそのまま、NODE_ENV=development node server.js 等すると、出力は
configure for development configure for all
となるので、やっぱりprior toしてない気がする。prior toが時間の前後関係を表しているのではなく、他の意味合いがあるのでしょうか。
結局のところ
configureは、環境ごとに切り替える必要のある処理を、簡単にかけるっていうものと理解していいのかな。どうやら特に特別なタイミングでコールバックされるわけでもなさそうなので、あくまで簡易なユーティリティ関数とでも思っておこう。