什么是在模块之间传递Socket.IO套接字的正确方法?
目前我有一个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(...);
有没有更好的方法来做到这一点似乎有点人为的做法呢?
编辑:我想要一个通用的解决scheme,发射一个消息,这是不是由客户端套接字启动的问题。 例如,假设我从外部来源检索股票价格,并希望在价格更新时触发事件。 由于它不是客户端启动的,我怎样才能访问套接字? 或者,也可以让我们说,我希望发出一个套接字消息响应一个POST请求。 我再次不知道如何访问套接字。
有许多共享套接字的选项,但它有助于更多地了解你的模块将要做什么。 不知道更多,我会build议你通过你调用的函数传递套接字到模块,而不是试图使用一些共享状态。
如果你需要使用一个共享状态(你试图发送消息给特定的用户,而不是套接字消息触发),那么我会build议坚持一个build立的会话框架,只是坚持套接字ID。 只需使用id即可获得正确的套接字。
看到这个答案如何使用socket.io会话: socket.io和会话?
添加一些细节,我会修改我的答案。
UPDATE
如果您只是试图向连接的所有人广播,则不需要套接字句柄。 从任何引用socket.io的模块,你可以调用io.sockets.emit('stuff')
。