io.socket.on()
指定されたeventName
でSailsからのソケットイベントのリスニングを開始します。一致するイベントを受信すると、提供されたコールバック関数をトリガーします。
io.socket.on(eventName, function (msg) {
// ...
});
引数 | 型 | 詳細 | |
---|---|---|---|
1 | eventName | ソケットイベントの名前です。例:'recipe' や'welcome' 。 |
|
2 | handlerFn | サーバーがこのソケットに通知をブロードキャストしたときに呼び出されるイベントハンドラーです。受信したソケット通知がeventName と一致する場合にのみ呼び出されます。 |
引数 | 型 | 詳細 | |
---|---|---|---|
1 | msg | ソケット通知からのデータです。 |
このイベントハンドラーは、クライアントが指定されたイベント名(例:'welcome'
)と一致するソケット通知を受信したときに呼び出されます。これは、サーバーがこのソケットに直接メッセージをブロードキャストした場合、またはソケットがメンバーであるルームにブロードキャストした場合に発生します。ソケット通知をブロードキャストするには、ブループリントAPIを使用するか、サーバー側のコード(例:アクション、ヘルパー、またはコマンドラインスクリプト内)を記述する必要があります。これは通常、次のいずれかの方法で実現されます。
sails.sockets
)"order"イベントをリッスンする
io.socket.on('order', function onServerSentEvent (msg) {
// msg => {...whatever the server broadcasted...}
});
レストランチェーンの注文システムを構築していると想像してください。
// In your frontend code...
// (This example uses jQuery and Lodash for simplicity. But you can use any library or framework you like.)
var ORDER_IN_LIST = _.template('<li data-id="<%- order.id %>"><p><%- order.summary %></p></li>');
$(function whenDomIsReady(){
// Every time we receive a relevant socket event...
io.socket.on('order', function (msg) {
// Let's see what the server has to say...
switch(msg.verb) {
case 'created': (function(){
// Render the new order in the DOM.
var newOrderHtml = ORDER_IN_LIST(msg.data);
$('#orders').append(newOrderHtml);
})(); return;
case 'destroyed': (function(){
// Find any existing orders w/ this id in the DOM.
//
// > Remember: To prevent XSS attacks and bugs, never build DOM selectors
// > using untrusted provided by users. (In this case, we know that "id"
// > did not come from a user, so we can trust it.)
var $deletedOrders = $('#orders').find('[data-id="'+msg.id+'"]');
// Then, if there are any, remove them from the DOM.
$deletedOrders.remove();
})(); return;
// Ignore any unrecognized messages
default: return;
}//< / switch >
});//< / io.socket.on() >
});//< / when DOM is ready >
この例では、バックエンドがどこかの時点で
.publish()
または.broadcast()
を呼び出すことを前提としていることに注意してください。これは、カスタムコードを介して、またはブループリントAPIを介して行うことができます。
'connect'
イベントデフォルトでは、Sailsソケットクライアントがページにロードされると、自動的にソケットの接続を開始します。デフォルトの自動接続ソケット(io.socket
)を使用する場合、ソケットが接続されるのを待つ必要はありません。つまり、他のソケットイベントをリッスンしたり、io.socket.get()
のようなメソッドをすぐに呼び出すことができます。Sailsソケットクライアントは、その間に実行したすべてをキューに入れ、接続がライブになると自動的に再生します。
したがって、'connect'
イベントを直接使用することは、ほとんどのアプリでは必要ありません。ただし、完全に説明するために、独自の'connect'
ハンドラーをバインドすることもできることに言及する価値があります。
io.socket.on('connect', function onConnect(){
console.log('This socket is now connected to the Sails server.');
});
'disconnect'
イベントサーバーの再起動やクライアントに何らかのネットワークの問題が発生したなどで、ソケットのサーバーへの接続が中断された場合は、エラーメッセージを表示したり、ソケットを手動で再接続したりするために、disconnect
イベントを処理することが可能です。
io.socket.on('disconnect', function onDisconnect(){
console.log('This socket lost connection to the Sails server');
});
ソケットは自動的に再接続するように構成できます。ただし、Sails v1の時点では、Sailsソケットクライアントはこの動作をデフォルトで無効にしています。実際には、ユーザーインターフェースが切断中にソケット通知を見逃している可能性があるため、関連するカスタムロジックをほぼ常に手動で処理する必要があります。(例:「インターネット接続を確認してください」というエラーメッセージ)。
- ソケットは、ブラウザータブが開いている間など、接続されている間のみ、または
.unsubscribe()
または.leave()
を使用してサーバー上で手動でサブスクライブ解除されるまで、ルームにサブスクライブしたままになることを忘れないでください。- リソースフルPubSub呼び出しおよびブループリントからのソケットメッセージをリッスンする場合、イベント名は常に呼び出し元のモデルのIDと同じです。たとえば、「UserComment」という名前のモデルがある場合、モデルのID(したがって、
UserComment.publish()
で使用されるソケットイベント名)は「usercomment」です。- コンテキストとして、ソケット通知は「サーバー送信イベント」または「Comet)メッセージ」と呼ばれることもあります。