ExpressJSでビューのヘルパー関数を使えるようにしてみた

#もしくはビューにクラス・メソッドを渡す方法とも言う
Node.jsで使えるExpressを触っていて、まぁ普通に使えるレベルだと思うんだけど、何だか足りないなーと思うところがいくつかあったりします。
そのうちの一つがビューで整形のために使うヘルパー関数が無いという事です。実際にはあるのかも知れませんが、試してみた実装方法の一つとしてご紹介。

ディレクトリ構成

Expressの初期のディレクトリ構成は以下の様になっています。

  • public
  • routes
  • views

これにhelpersディレクトリを追加します。

  • helpers
  • public
  • routes
  • views

ヘルパー関数

helpersディレクトリにcommon.jsファイルを追加します。このファイル名は別名でも構いませんが、共通で使いそうなという事でこの名前にしています。
メソッドは2つ

  • true/falseから性別を返すget_gender
  • JIS X 0401のコードから都道府県名を返すget_pref
exports.get_gender = function(gender){
	gender = (gender === 'true' || gender === true) ? true : false;
	return gender === true ? '男性' : '女性';
}

exports.get_pref = function(code){
	switch (parseInt(code)) {
		case  1: return '北海道'; break;
		case  2: return '青森県'; break;
		case  3: return '岩手県'; break;
		case  4: return '宮城県'; break;
		case  5: return '秋田県'; break;
		case  6: return '山形県'; break;
		case  7: return '福島県'; break;
		case  8: return '茨城県'; break;
		case  9: return '栃木県'; break;
		case 10: return '群馬県'; break;
		case 11: return '埼玉県'; break;
		case 12: return '千葉県'; break;
		case 13: return '東京都'; break;
		case 14: return '神奈川県'; break;
		case 15: return '新潟県'; break;
		case 16: return '富山県'; break;
		case 17: return '石川県'; break;
		case 18: return '福井県'; break;
		case 19: return '山梨県'; break;
		case 20: return '長野県'; break;
		case 21: return '岐阜県'; break;
		case 22: return '静岡県'; break;
		case 23: return '愛知県'; break;
		case 24: return '三重県'; break;
		case 25: return '滋賀県'; break;
		case 26: return '京都府'; break;
		case 27: return '大阪府'; break;
		case 28: return '兵庫県'; break;
		case 29: return '奈良県'; break;
		case 30: return '和歌山県'; break;
		case 31: return '鳥取県'; break;
		case 32: return '島根県'; break;
		case 33: return '岡山県'; break;
		case 34: return '広島県'; break;
		case 35: return '山口県'; break;
		case 36: return '徳島県'; break;
		case 37: return '香川県'; break;
		case 38: return '愛媛県'; break;
		case 39: return '高知県'; break;
		case 40: return '福岡県'; break;
		case 41: return '佐賀県'; break;
		case 42: return '長崎県'; break;
		case 43: return '熊本県'; break;
		case 44: return '大分県'; break;
		case 45: return '宮崎県'; break;
		case 46: return '鹿児島県'; break;
		case 47: return '沖縄県'; break;
		default: return 'エラー';
	}
};

app.js

適当なところでrequire()し、app.configure()内でapp.set()します。

var helpers = {
        common: require('./helpers/common')
}

app.configure(function(){
        //既存のものをそのまま
        app.set('helpers', helpers);
});

routes以下のjsファイル

res.render()でビューに登録したクラスを渡します。
#req.app.settings.helpersでも取れるみたいです。

res.render('top', {
	//...
	helpers: res.app.get('helpers'),
});

ビュー

ejsを使っています。

<%= helpers.common.get_gender(clients[i].gender) %>
<%= helpers.common.get_pref(clients[i].pref) %>

その他

実はコレ、apps.jsからroutes以下の別のjsファイルに設定情報や共通クラスとかを渡す時にも使えます。configディレクトリとか作ってまとめても良いかも知れません(というか、DBの接続情報とかの環境依存のものは別ファイルの方が良いですね)。