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の接続情報とかの環境依存のものは別ファイルの方が良いですね)。