使用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.emit
, broadcast
和io.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 }); } }