目前我有一个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请求。我再一次不确定如何访问套接字。
答案 0 :(得分:4)
共享套接字有很多选项,但它有助于更多地了解您的模块将要执行的操作。在不知情的情况下,我建议您通过您正在调用的函数将套接字传递给模块,而不是尝试使用某些共享状态。
如果您需要使用共享状态(您尝试将消息发送给由套接字消息以外的其他内容触发的特定用户),那么我建议坚持使用已建立的会话框架并仅保留套接字ID。您只需使用id即可获得正确的套接字。
有关如何将socket.io与会话一起使用,请参阅此答案:socket.io and session?
添加更多细节,我会修改我的答案。
更新
如果您只是尝试向所有已连接的人广播,则不需要套接字句柄。从任何引用socket.io的模块,您都可以调用io.sockets.emit('stuff')
。