我正在用sockets.io制作一个node.js应用程序。
我的应用程序的逻辑需要通过各自的套接字与客户端进行通信,但套接字的问题是它们在自己的代码"域"中。
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
// socket object is only available here
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
看到了?
我试图导出这个套接字对象
var Sockets = []
io.sockets.on('connection', function (socket) {
Sockets[socket.handshake.user.id] = socket;
});
现在它在
之外可用function myLogic(userid) {
Sockets[userid].emit('free!')
}
但是我遇到了奇怪的bug,因为它可能不应该这样使用…就像新的连接产生新的socket
对象,但以前的对象仍然存在于内存的某个地方,当它们的.on('..'
被触发时,它们仍然会做出反应…
在各自的io.sockets.on('connection', function(socket){}
范围之外使用socket
的正确方法是什么?
回答您的问题:如果您想在各自的"io.sockets "之外使用套接字。on('connection', function(socket){} scope"),你必须通过io对象——> io.socket .socket(socketId)来访问它们,其中socketId存储在某个地方。
为模块创建一个setup函数,并将初始化的套接字传递给它。Ie。类似于main.js:
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
var myModule = require('./myModule').setup(io);
然后在myModule.js中保存对io
对象的引用:
var localIo;
exports.setup = function(io) {
localIo = io;
};
// Then after in your other code....
function myLocalFunction(myData) {
localIo.sockets.volatile.emit('myevent', {data: myData});
};