0

我想在我的应用程序中创建一个 socket.IO 对象,并且我想在我的应用程序中的任何地方都可以访问它,而不使用 GLOBALS 或 hacks,并且还要确保始终只加载一个实例。

经过一番思考,我想出了这个模块

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 回答