2012年11月12日月曜日

[node.js + express]express3.x で flash メッセージを使おう

前回の投稿からずいぶんたってしまいましたが、、最近はnode + express + mongodb でアプリケーションを作っているので、その中で学んだことを少しずつまとめていきたいと思います。

今回は、expressバージョン3.x 以降で、flashメッセージを使う方法を紹介します。

express では、バージョン2.x 以前では req.flash というメソッドが提供されていましたが、3.x では廃止されたようです。
https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x

代替手段として、 session もしくは、connect-flashモジュールを使う方法が挙げられているので、この2つの方法を使ってflashメッセージ機能を実装してみます。

session を使って実装


まずはsessionにflashメッセージをセットします。
なお、実行にはcookieParser と session ミドルウェアが必須となりますので、注意してください。

app.js
app.get('/entries', function(req, res){

    if(!req.user){
      req.session.messages = ["ログインしてください"];
      res.redirect('/login');
    }

    //省略
  });

session に格納されたメッセージを、view から参照できるようにします。
各 route でメッセージを view に渡しても良いのですが、ここでは、view から直接アクセスできる、 res.locals に flashメッセージを格納するミドルウェアを作成しています。
これで、リクエストの度に res.locals.messages は req.session.messages の値で初期化されます。
req.session.messages をクリアするのをわすれずに!

app.js
app.configure(function(){
    //省略

    app.use(express.cookieParser('your secret here'));
    app.use(express.session());

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

    //省略
  });

view からは、messages にアクセスすることで、flashメッセージを取得できます。

login.jade
- if(messages)
    each message in messages
      p= message 

connect-flash モジュールを使う


connect-flash(https://github.com/jaredhanson/connect-flash)モジュールを使えば、より簡単にflash機能を実装できます。
設定方法は、connect-flash をミドルウェアとして登録するだけです。
なお、connect-flash の実行には、cookieParser と session ミドルウェア が必須なので、この2つよりも後に connect-flash を呼び出す必要があります。

app.js
var flash = require('connect-flash');

  //省略

  app.configure(function(){

    //省略

    app.use(express.cookieParser('your secret here'));
    app.use(express.session());

    app.use(flash());

    //省略

  });

以上で、req オブジェクトに flash() が追加されました。
メッセージの設定と取得方法は以下のとおりです。

flashメッセージを設定

app.js
app.get('/entries', function(req, res){
    if(!req.user){
      req.flash('alert', 'ログインしてください。');
      res.redirect('/login');
    }

    //省略
  });

flashメッセージを取得

app.js
app.get('/login', function(req, res){
    res.render('login', {message: req.flash('alert')});
  });

まとめ


express3.x 以降では、req.flash の変わりにsession を使うか、connect-flash モジュールを使う。
特別な理由がない限り、しっかりテスト済みの connect-flash モジュールを使うべきでしょう。

0 件のコメント:

コメントを投稿