コントロールの流れを反転しようとしています。これを行う方法は、サーバーが制御を渡すために使用できるインターフェース(API)をコントローラーが実装することです。
簡単な例は次のようになります。
mycontroller.js
// no require needed here, at least, I don't think so
// Controller agrees to implement the function called "respond"
module.exports.respond = function(socket_io){
// this function expects a socket_io connection as argument
// now we can do whatever we want:
socket_io.on('news',function(newsreel){
// as is proper, protocol logic like
// this belongs in a controller:
socket.broadcast.emit(newsreel);
});
}
で今server.js
に:
var io = require('socket.io').listen(80);
var controller = require('./mycontroller');
io.sockets.on('connection', controller.respond);
コントローラAPIが正確にsocket.ioコールバックのように見えるので、この例では単純です。しかし、コントローラに他のパラメータを渡したい場合はどうすればよいでしょうか? io
オブジェクト自体やエンドポイントを表す変数のように?そのためにはもう少し作業が必要ですが、それほど多くはありません。それは基本的に私たちはしばしばからの脱出やクロージャを作成するために使用するのと同じトリックです:ファンクションジェネレータ:mycontroller.js
我々は最後に合格するためにはもう少し作業が必要と思い、サーバー上の今
module.exports.respond = function(endpoint,socket){
// this function now expects an endpoint as argument
socket.on('news',function(newsreel){
// as is proper, protocol logic like
// this belongs in a controller:
endpoint.emit(newsreel); // broadcast news to everyone subscribing
// to our endpoint/namespace
});
}
で
ポイント:我々はストレートsocket
を渡すが、我々はクロージャを経由してchat
をキャプチャ
var io = require('socket.io').listen(80);
var controller = require('./mycontroller');
var chat = io
.of('/chat')
.on('connection', function (socket) {
controller.respond(chat,socket);
});
注意してください。これにより、それぞれ独自のコントローラを持つ複数のエンドポイントを持つことができます。
var io = require('socket.io').listen(80);
var news_controller = require('./controllers/news');
var chat_controller = require('./controllers/chat');
var news = io
.of('/news')
.on('connection', function (socket) {
news_controller.respond(news,socket);
});
var chat = io
.of('/chat')
.on('connection', function (socket) {
chat_controller.respond(chat,socket);
});
実際には、エンドポイントごとに複数のコントローラを使用することもできます。コントローラーはイベントの購読とは別に何もしないことを覚えておいてください。これは、リスニングをやっているサーバーです:
var io = require('socket.io').listen(80);
var news_controller = require('./controllers/news');
var chat_controller = require('./controllers/chat');
var chat = io
.of('/chat')
.on('connection', function (socket) {
news_controller.respond(chat,socket);
chat_controller.respond(chat,socket);
});
それも平野socket.io(なしエンドポイント/名前空間)で動作します:
var io = require('socket.io').listen(80);
var news_controller = require('./controllers/news');
var chat_controller = require('./controllers/chat');
io.sockets.on('connection', function (socket) {
news_controller.respond(socket);
chat_controller.respond(socket);
});
は、あなただけの 'io.sockets.emit(呼び出すことはできません) '? –
私はすべてのユーザーにメッセージを送信しません。したがって、私はアクティブなソケットをフィルタリングするためにソケットオブジェクトが必要です...私のコードを更新しました – tschiela
私はどちらかのアプリをデバッグし、ソケットが作成され、フィルタリングされたり、同じ効果。物事の仕組みについてのあなたの前提の1つは、邪魔になります。 HTTPリクエストが発生したときに特定のソケットにメッセージを送信したいと思いますか?あなたのアプローチはうまくいくはずですが、個人的には、単一のラッパーモジュールですべてのsocket.ioアクセスを取得し、必要なものをエクスポートします。 'mysockets。 –