2017-12-12 15 views
0

私はwebtocketを設定するためにシングルトンパターンを使用しています。 Client SideからNode.jsのSocket.ioを使用してルートファイルを生成する方法

var sio = require('socket.io') 
var io = null; 

exports.io = function() { 
    var socket; 
    if(io === null){ // Initialise if not already made 
    io = initialize(server); 
    } 
    return io; 
}; 

exports.initialize = function(server) { 

    io = sio.listen(server); 
    var connections = []; 

    console.log('IO Initialized!\n') 

    io.on('connection', function(socket){ 
    connections.push(socket); 
    console.log('Connected: %s sockets connected', connections.length); 

    socket.on('disconnect', function(data){ 
     connections.splice(connections.indexOf(socket), 1); 
     console.log('Disconnected: %s sockets connected', connections.length); 
    }); 

    // Update function used to send messages to and from backend 
    socket.on('update', function(data){ 
     io.sockets.emit('new message', {msg: data}); 
    }); 


    }); 

}; 

そして、私のjavascript /公共のファイルに私はルートファイルから成功裏に発することができる

router.use(function(req, res, next){ 
    if(socket === undefined){ 
     socket = io.io(); 
    } 
    next(); 
}); 

router.get('/', function(req, res, next){ 


    socket.on('update', function(data){ 
     console.log('in routes'); 
    }); 

    socket.emit('update', 'leaving routes'); 
}); 

私が持っているので、

$(function(){ 

    var socket = io.connect(); 
    socket.emit('update', 'Test Update'); 
    socket.on('update', function(data){ 
     console.log('here: ' + data); 
    }); 
}); 

のように、私のルートファイルでこれらを呼び出すことができますパブリックjsファイル(バックエンドからフロントエンドまで)にコピーします。しかし、パブリックjsファイルからルートファイルに情報を送信することはできません。シングルトンパターンのjsファイルにのみ送信されます。代わりにルートファイルに送信するにはどうすればいいですか?私がこれについて間違ったやり方をしているのなら、誰かが経路とパブリックjsファイルの間のやりとりの方法を教えてください。

+0

あなたは 'socket'が何であるのか誤解しているのが分かります。それはすべての着信クライアント接続のためのユニークなオブジェクトです。それはシングルトンではありません。あなたは単にそれをグローバルとして参照することはできません。実際、あなたが実際に使うことができる唯一の場所は 'io.on( 'connection'、.... ....)ハンドラの中です。なぜなら、それはそれぞれの新しい' socket'オブジェクトに接続を提供するからです。あなたのルートでやろうとしていることが、その瞬間にリクエストを出している特定のユーザに対応するソケットオブジェクトにアクセスすることであれば、それはまったく異なる質問です。 – jfriend00

+0

「エクスプレスルート内のアクセスsocket.io接続」をここで検索し、見つけたものを表示することをお勧めします。 2つを接続する通常の方法は、セッションオブジェクトを介して行います。そして、socket.io接続が接続されたときに、セッションの初期化を行います。その結果、後でルートでセッションを見ると、そこからsocket.idにアクセスできます。ソケットオブジェクトを取得できます。 – jfriend00

答えて

0

私の知る限り、シングルトンの設定には何も問題はありません。

しかし、は、イベントをリスニングする予定のすべての場所で、io.on('connection', ...)にラップする必要があります。これをシングルトンにすることは、これが要件であることを妨げるものではありません。

編集:私ここで間違っている可能性があり、私はちょうどexports.initializeが実際にconnectionsを返していないことに気付きました。それを試した?

関連する問題