Node.js
Sails.js

SailsのSocket周りが色々と変更になってたメモ

More than 3 years have passed since last update.

node.jsでフルスタックMVCフレームワークではSailsが一番素晴らしいと思っている私です。
最近はGruntからGulpに置き換えたり、CoffeeScriptで書いたりしています。

経緯

・Socket.ioを使おうとした
・サンプル通りにやっても動かない
・ドキュメントが整理中でまともに機能してない
・ソースコードリーディングした
・解決!

本題

SailsにはblueprintsというModelを定義するだけでREST APIを作成することができるツールがあります。
これは、最近のモダンなフレームワークにならよくある機能かと思います。
このREST APIを生成出来る機能がsails.ioと併合して、より使いやすくなりました。

まず、sails.io.jsをscriptタグで読み込んでおくのが前提です。
そしたらブラウザでログを開いてみましょう。

舟のAAが表示されていれば接続完了です。
特に何もコードを書いていなくてもブラウザのログに表示されるかと思います。
もし表示されなかったり、表示されるまで時間がかかった場合は、WebSocket非対応か、Nginxなどでリバースプロキシを使用している際にheaderを削ってしまっている可能性があります。

それでは早速socketを使ってみましょう。

まずは普通にAPIを叩いてみましょう。
通常はjquery等のXHRを使ったり、AngularJSの$httpのようなものを使用するかと思います。しかし、これらは毎回TCPのコネクションを使用するため、あまりモダンではありません。

SailsではREST APIをblueprintsを通してsocketを使って取得することができます。

io.socket.get "/st?limit=0", (msg)->
  console.log msg

普通にGETを叩くときのように使用出来ます。
大量のAPIを叩くときもsocket.ioを使用して通信するため、非常にモダンな感じになります。

また、modelの変更情報も簡単に取得することができます。

io.socket.on "st", (msg)->
  console.log msg

もうお気づきかもしれませんが、普通にhttpで叩いた時と同じデータが返ってくるので、pathにパラーメーターを追加して、より細かく待ち受けることができます。

また、Socket.ioの要であるroom機能もラップされて実装されていますので、詳しくは公式ドキュメントを御覧ください。
http://sailsjs.org/#/documentation/reference/websockets/sails.sockets/sails.sockets.join.html