Posted at

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