0

アプリで socket.IO オブジェクトを作成し、GLOBALS やハックを使用せずにアプリケーションのどこからでもアクセスできるようにし、常に 1 つのインスタンスのみが読み込まれるようにしたいと考えています。

少し考えた後、私はこのモジュールを思いつきました

var io = null;

// This module is a siglenton. It initializes itself
// the first time require() calls it and all the 
// next times  it simply returns the object that was 
// initally created
module.exports = function(server){
// If io is not initialized, initialize it before returning

if(!io)
{
    io = require('socket.io').listen(server);

    io.sockets.on('connection', function (socket) {
      socket.on('message', function (data) {
          //Do stuff
      });
    });
}

return io;
}

理論的にはうまくいくように見えますが、実際には毎回新しいオブジェクトを生成し続けます

var http_server = http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});


var a = require('my_io')(http_server);
var b = require('my_io')();
console.log(a === b); //Echoes false

ここで何か不足していますか?どうすればいいですか?

4

1 に答える 1

0

これが私が最終的にやったことです

私のモジュールをこれに変更しました:

var IO_Object = function(){

  this.io = null;

  this.init = function(server){
    this.io = require('socket.io').listen(server);      

    this.io.sockets.on('connection', function (socket) {
        socket.on('sync_attempt', function (data) {
            console.log(data);
        });
    });
  };
};


module.exports = new IO_Object();

オブジェクトを初期化するために app.js でこれを行います

var my_IO = require('my_io');
my_IO.init(http_server);

その後require('my_io')、最初のインスタンスを取得するために、アプリのどこにでも行きます。完璧に動作します!

于 2013-08-31T20:11:29.137 に答える