SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所

Node.jsのWebフレームワーク「Sails」を使ってpub/subアプリを作ってみる

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所 第11回


 また、加えてCSRF対策も有効にしてみます。config/csrf.jsのmodule.exports.csrfの値をtrueに変更し、メッセージ送付時にトークンを付けて送るようにします。トークンはajaxやsocket用にトークンを発行してくれるエンドポイントがデフォルトで準備されているので、そちらにgetして取得します。エンドポイントは/csrfTokenです。トークンはJSONで{_csrf:'xxxxx'}と返されてきますので、_csrfの値を取出し保持しておきます。メッセージ送信時にはパラメータ値'_csrf'にこちらのトークンを含めて送信します。

//ChatRoomController
 /**
  * Action blueprints:
  *    `/chatroom/room`
  */
  room: function (req, res) {
    //とりあえずユーザのlastnameをビューに表示追加
    res.view({'chatterName':req.session.passport.user.lastName});
  },
//room.ejs
<div id='messages'>
  <ul id='message_list'>
  </ul>
</div>
<div>
  <span>ChatterName: </span><span id="chattername"><%= chatterName %></span>
</div>
                                ・
                                ・
                                ・
//app.js
(function (io) {
  // as soon as this file is loaded, connect automatically, 
var socket = io.connect();
var csrfToken = "";
socket.get('/scrfToken',function(res){csrfToken = res._csrf;});    
                                ・
                                ・
                                ・
socket.on('message', function messageReceived(message) {
  //メッセージ送信者の名前を追加
  addMessage(message.data.chatterName,message.data.message);
                                ・
                                ・
                                ・
$('#send').click(function(){
      //送信者名を画面の表示から取って追加してメッセージを送信
          socket.post('/message',
                      {'chatterName':$('#chattername').text(),'message':$('#message').val(),'_csrf':csrfToken},
                      function(res){});
          $('#message').val('');
        });
                                    ・
                                    ・
                                    ・
    //引数にメッセージの送信者名を追加
    function addMessage(chatterName,message){
        var chatMsg = '<li>'+escapeMessage(chatterName)+': '+escapeMessage(message)+'</li>';
        $('#message_list').append(chatMsg);
    }
    function escapeMessage(msg){
        return $('<div/>').text(msg).html();
    }

 ビューの追加を行ったら、アプリを起動し、実際にログインから投稿、投稿時の投稿ユーザ名の表示までできるか確認してみます。ログインボタンを押下後はGoogleの認証画面に遷移して、認証後にチャットルームが表示されます。

chat_image1
chat_image1

見た目を整える

 最後におまけ的ですが、見た目を整えておきます。こちらはおなじみのBootstrapを組込んでみます。使用するBootstrapのバージョンは3.1.1です。組込むといっても、特別なことをするわけではありません。すでにアセットについては説明したとおりなので、linkerディレクトリ下の対応するディレクトリにダウンロードしてきたBootstrapのcssとjsをそれぞれコピーします。linker以下へのコピーは、Bootstrapのディレクトリ構成を保ったままディレクトリごと(例えばcssディレクトリごと)行います。ディレクトリの中身に含まれるものはミニファイされたものだけでよいです。またJavaScriptの読み込み順は、先ほど説明したGruntfile.jsの設定で、jQueryが先になるようにしておきます。

 コピーが済んだら、ビューそれぞれにテンプレートを当てはめていきます。

enter image description here
enter image description here
enter image description here
enter image description here

 テンプレートの適用ができたら、再びアプリを立上げ確認してみます。どうでしょう? 多少はそれらしくなってきたでしょうか?

まとめ

 今回は、Sails組み込みのpub/sub機能を利用した簡単なチャットアプリの実装を説明しました。リアルタイム系のアプリを割と簡単に実装できそうな感じをつかんでいただけましたでしょうか? 今回は紹介しきれませんでしたが、SailsにはWebアプリを作成するのに必要なさまざまな機能が用意されています。また、最近よく用いられるBackboneやAngularといったクライアントサイドのフレームワークも比較的容易に採用できるようになっています。Sails自体日々改良が加えられ続けていて、機能強化も進んでいますので、もし今回の記事で興味をもたれた読者の方がいらっしゃれば、ぜひ手元でいろいろと試してみてください。

 Tech-Sketch出張所の次の記事は、年度明け公開に向け企画中です。次回もお楽しみに!

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
近未来の技術トレンドを先取り! 「Tech-Sketch」出張所連載記事一覧

もっと読む

この記事の著者

佐伯 純(TIS株式会社)(サエキ ジュン)

TIS株式会社 AIサービス事業部AIサービス企画開発部所属入社後、アジャイルで商品先物取引のシステム開発という当時としてはかなり尖ったチームに放り込まれ、以来SIerとは思えない辺境を歩き続けている。現在の部門に異動してからはRubyOnRailsを利用した社内向けサービスの開発に参加後、Andr...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7696 2014/04/02 13:24

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー