【问题标题】:What's the correct way to pass a Socket.IO socket between modules?在模块之间传递 Socket.IO 套接字的正确方法是什么?
【发布时间】:2012-05-04 16:40:20
【问题描述】:

目前我有一个 getter/setter 套接字模块,如下所示

var socket;

module.exports.getSocket = getSocket;
module.exports.setSocket = setSocket;

function getSocket() {
    return socket;
}
function setSocket(sock) {
    if (undefined == socket) socket = sock;
}

在app.js中我设置如下

var sio = require('./lib/socket');
var io = require('socket.io').listen(app);
io.sockets.on('connection', function (socket) {
    sio.setSocket(socket);
});

在我的模块中我使用如下

sio = require('./lib/socket');
socket.getSocket().broadcast.emit(...);

似乎有点做作,有没有更好的方法来做到这一点?

编辑:我想要一个通用的解决方案来解决触发不是由客户端套接字发起的消息的问题。例如,假设我从外部来源检索股票价格并希望在价格更新时触发一个事件。由于它不是客户端启动的,我如何才能访问套接字?或者,假设我希望触发套接字消息以响应 POST 请求。我再次不确定如何访问套接字。

【问题讨论】:

  • 除非您只有一个用户使用系统,否则您的代码将无法正常工作。问题是,第一个连接的人永远是由 getSocket 存储和返回的套接字。

标签: node.js socket.io


【解决方案1】:

有许多共享套接字的选项,但它有助于更​​多地了解您的模块将要做什么。在不了解更多信息的情况下,我建议您通过正在调用的函数将套接字传递给模块,而不是尝试使用某些共享状态。

如果您需要使用共享状态(您尝试将消息发送给由套接字消息以外的其他东西触发的特定用户),那么我建议您坚持使用已建立的会话框架并仅保留套接字 ID。只需使用 id 即可获得正确的套接字。

有关如何在会话中使用 socket.io,请参阅此答案:socket.io and session?

添加更多细节,我会修改我的答案。

更新

如果您只是尝试向所有连接的人广播,则不需要套接字句柄。在任何引用 socket.io 的模块中,您都可以调用 io.sockets.emit('stuff')

【讨论】:

  • 已更新。您是要向特定用户发送消息,还是向所有人发送消息?
  • 我收到以下错误,TypeError: Cannot read property 'emit' of undefined
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 2014-09-22
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多