使用Socket.io将套接字传递给Node.js中的模块

我有一个模块

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.emitbroadcastio.sockets.emit

有几种方法可以解决这个问题。 这取决于你想如何使用实际的模块。 每个套接字只有一个实例,或者每个套接字只有一个实例。 我build议你让你的模块返回一个构造函数而不是像下面这样的对象:

 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 }); } } 

然后你可以创build包含实际套接字的新对象。

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

一种解决scheme可能是用每个连接sockets来做到这一点。

 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 }); } }