2014-12-14 2 views
2

У меня есть модульPass гнездо для модуля в Node.js с помощью Socket.io

var exports = module.exports = {}; 

exports.refresh = function (msg) { 
    socket.emit('refresh', { message: msg }); 
} 

exports.lock = function (msg) { 
    socket.emit('lock', { message: msg }); 
} 

и в моих server.js я определил

var io = require("socket.io").listen(server); 

и вызовите модуль

var period = require('./server/functions/period.js'); 

Как передать Socket модулю (period.js), чтобы у меня был доступ к методам сокета, например socket.emit, broadcast и io.sockets.emit.

ответ

1

Существует несколько способов решить эту проблему. Это зависит от того, как вы хотите использовать фактический модуль. Только один экземпляр для каждого сокета или один для каждого сокета. Я предлагаю вам сделать ваш модуль возвращает конструктор вместо объекта литерала, как показано ниже:

module.exports = function(socket) { 
    var socket = socket; 

    this.refresh = function (msg) { 
     socket.emit('refresh', { message: msg }); 
    } 

    this.lock = function (msg) { 
     socket.emit('lock', { message: msg }); 
    } 

} 

Затем вы можете создавать новые объекты, содержащие фактическое гнездо.

var Period = require('./server/functions/period.js'), 
    period = new Period(socket); 

Одним из решений, вероятно, было бы сделать это с каждым соединительным гнездом.

var periodModule = require('./server/functions/period.js'), 

io.on('connection', function(socket){ 
    var period = new periodModule(socket); 

    //make a call 
    period.refresh(); 
}); 

Вы также можете передать объект io в свой модуль, чтобы получить интерфейс вещания.

module.exports = function(socket, io) { 
    var socket = socket, 
     io = io; 

    this.broadcastSomething = function(..) { 
     io.emit('data', { data: 'data'}); 
    } 

    this.refresh = function (msg) { 
     socket.emit('refresh', { message: msg }); 
    } 

    this.lock = function (msg) { 
     socket.emit('lock', { message: msg }); 
    } 

} 
+0

Большое спасибо! я изменил свой модуль в конструкторе, но теперь я получаю сообщение об ошибке при вызове параметра period.refresh(), что нет метода 'refresh'. Есть идеи? – nofear87

+0

попробуйте вернуть это в модуле – cbass

+0

не работает :( – nofear87

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