在其专用'connection'范围之外使用套接字



我正在用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}); };

最新更新