2013-08-31 4 views
0

Я хочу создать объект socket.IO в своем приложении, и я хочу сделать его доступным извне в моем приложении, не используя GLOBALS или хаки, а также убедитесь, что загружается только один экземпляр.Могу ли я заставить require() получать один экземпляр объекта каждый раз, когда я его вызываю?

Поразмыслив, я пришел с этим модулем

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 

я упускаю что-то Вот? Как я должен это делать?

ответ

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') всюду в моем приложении, чтобы получить исходный экземпляр. Работает отлично!

Смежные вопросы