2013-10-24 8 views
17

新しいオブジェクトがデータベースに挿入されている場合、クライアントにメッセージを送信するためにsocket.ioが必要です。だから私の考えは、私のコントローラの挿入メソッドから直接メッセージを出すことでした。私server.jsファイルでは、IAMはsocket.ioオブジェクトを作成し、他のモジュールのためにそれがアクセスできるようにしてみてください。私のコントローラでコントローラでsocket.ioを使用

var server = require('http').createServer(app); 
var io = require('socket.io').listen(server); 

//make socket io accessible for other modules 
module.exports.io = io; 

私はこのようsocket.io使用してみてください:

var io = require('../server').io; 
... 
io.sockets.on("connection", function(socket){ 
    passportSocketIo.filterSocketsByUser(io, function (user) { 
    return user.workingAt === socket.handshake.user.workingAt; 
    }).forEach(function(s){ 
    s.send("news", insertedObject); 
    }); 
}); 

そしてここで私は固執した。 "接続"イベントは発生しないので、メッセージは送信されません。それは別のファイルでsocket.ioを使用する正しい方法ですか?残念ながら、複雑なsocket.ioの例は見つかりません。

+0

は、あなただけの 'io.sockets.emit(呼び出すことはできません) '? –

+0

私はすべてのユーザーにメッセージを送信しません。したがって、私はアクティブなソケットをフィルタリングするためにソケットオブジェクトが必要です...私のコードを更新しました – tschiela

+1

私はどちらかのアプリをデバッグし、ソケットが作成され、フィルタリングされたり、同じ効果。物事の仕組みについてのあなたの前提の1つは、邪魔になります。 HTTPリクエストが発生したときに特定のソケットにメッセージを送信したいと思いますか?あなたのアプローチはうまくいくはずですが、個人的には、単一のラッパーモジュールですべてのsocket.ioアクセスを取得し、必要なものをエクスポートします。 'mysockets。 –

答えて

42

コントロールの流れを反転しようとしています。これを行う方法は、サーバーが制御を渡すために使用できるインターフェース(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); 
}); 
+0

を報告しますあなたのおかげで、非常にstreight前方に見える素晴らしい答えです。しかし、私は1つの質問があります:複数のコントローラでsocket.ioを使いたいのですが? – tschiela

+1

これは2番目の部分でカバーされています - 各コントローラに別々のエンドポイントを使用してください。 – slebetman

+0

ありがとう、greateの回答 – tschiela

関連する問題