Node.js-Socket.io-Express 3

标签 node.js sockets express socket.io

我是 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 中?

最佳答案

io.sockets.on('connection', function(socket) {...}) 中的 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/

相关文章:

node.js - 从nodejs/express 项目中提供 swagger-ui

javascript - 在 Node.js 中允许 CORS 用于 PUT

java - Java 中的 IMAP 客户端(仅限套接字)在接收时挂起

node.js - 为什么我得到 "cannot find module"我已经尝试了一切

c - 套接字编程读写与客户端服务器

c - OpenSSL ASN1_item_ex_d2i 内存泄漏

node.js - MongoDB/Mongoose 填充

node.js - Express 和 Node.js 超时

javascript - 如何在node.js express中的路由结束()之后停止中间件序列

javascript - 使用 GraalVM 将变量参数从 javascript 传递给 java 函数