Expressのviewでセッションの値を使う方法

expressでアプリ作っててハマったので備忘録

経緯

そもそもviewでセッションの値使う書き方していいのかは定かではないが、セッションに保存している値をviewしようとしてjadeで以下のように書くとsessionがundefinedだって怒られる

    div
      req.session.hoge

まぁviewでreqとか扱えなさそうなので当然っちゃ当然なのだがどうにかしたい

対策

結論から言うと、middlewareを追加してviewで参照可能な変数に入れるようにする
コードはこうなる

app.use(function(req, res, next){
    res.locals.hoge = req.session.hoge;
    next();
});

どうやらres.localsにviewからアクセスできる変数が定義されるらしく、そこに新たにパラメータを追加してやり、セッションのhogeを入れることで参照可能になるようだ
こうするとviewのjadeでは以下のようにすると値が取れる

    div
      hoge

補足事項

ネットで情報を探していると以下のような書き方を載せているものがあった

app.dynamicHelpers({
    session: function (req, res) {
        return req.session;
    }
});

最初はこれを使ったんだけどまー動かない
このdynamicHelpersってやつはexpress 3.x系では廃止されたらしい
このことはexpress公式のmigrationガイドにも記載があるので注意

また、middlewareを定義する位置なのだが、「app.use(app.router)」より前に書かないと動かない
中まで追ってないから原因はわからないが、そういうもんらしい
これは言うまでもないが「app.use(express.session(・・・」の後に書かないとsessionが正しく読めないっぽくて怒られるので、動かない場合は書く位置を見なおしてみると良い