我是 Node.js 和 Express 的菜鸟 :( 我在访问其他模块中的 socket.io 对象时遇到问题。我已经创建了一个全局变量来保存套接字对象,但是一旦该用户关闭连接该连接不再可用。从技术上讲,我猜该连接仍然存在,但由于资源原因我将其删除。
请注意,每次建立连接时,我们都会将该套接字分配给所有其他模块都可以访问的全局变量。
// App.js
var io = require('socket.io').listen(server);
var sessionsConnections = {};
io.sockets.on('connection', function (socket)
{
global.socket = socket;
sessionsConnections[socket.id] = socket;
.....
}
socket.on("disconnect", function()
{
delete sessionsConnections[socket.id];
});
// Match.js
global.socket.emit('lobby:createMatch', data);
如果最后分配给全局的连接关闭 Match.js 将被搞砸。此时 Match.js 是唯一需要 socket.io 引用的模块。 Match.js 有一堆用于处理事件、发出更改和渲染 View 的导出。
对如何处理有任何建议吗?为了成为全局引用,是否可以实例化初始套接字连接以存在于 App.js 中?
最佳答案
socket
中的 io.sockets.on('connection', function(socket) {...})
变量对于每个连接都是不同的。
由于在您的代码中 global.socket
始终是对相对于最后连接的客户端的套接字的引用,因此如果此客户端断开连接,则此套接字将死亡是正常的。
无论如何,我看不出有任何理由使用全局变量。如果需要向特定客户端发送消息,可以在连接回调中使用 socket
变量:
io.sockets.on('connection', function (socket)
{
socket.emit('foo', 'bar');
}
如果你需要访问另一个模块中的套接字,你可以导出
sessionsConnections
对象,并通过它的 id 访问你需要的套接字://In app.js
exports.connections = sessionsConnections;
//In match.js
var app = require('./app.js');
app.connections[clientId].emit('foo', 'bar');
当然,您需要在某处跟踪 ID。
关于Node.js - Socket.io - Express 3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13739750/