我有一个 node.js 服务器,它使用 Socket.io 向客户端发出事件。当连接事件发生时,新的套接字会根据连接用户的 id 放置在房间中,该 id 使用来自 的会话 id cookie 获取socket.headers.handshake.cookie。我知道这部分正在工作,因为我可以设置断点并检查io.sockets.adapter.rooms并查看这个房间:所以,房间里显然只有一个插座。同样在此断点处暂停时,以下表达式:userID.toString()计算结果为:"5cd6201acb0d5f23e465cb84"。所以,这个表达式应该可用于获得带有那个插座的房间。然后,直接在断点之后,执行以下代码:io.of('/').in(userID.toString()).emit('notification', notifHTML);因此,我希望通知事件仅发送到该房间中由该表达式标识的一个套接字。通知事件因此由客户端处理:socket.on('notification', function(notifHTML){ $("#notificationsContainer").prepend(notifHTML); $(".notifications-count").html('<i class="fas fa-dot-circle"></i>'); document.title = '(⚐) sweet';});然而,事实证明,连接到服务器的每个客户端都会收到该通知事件并以上述方式处理它;当我有三个浏览器连接到服务器时,它们三个都执行上面的代码;我可以在页面和新文档标题中看到结果。我实际上可以通过将具有 .to 的那一行替换为以下内容来解决此问题:io.of('/').in(userID.toString()).clients(async (error, clients) => { for (var client of clients) { io.sockets.connected[client].emit('notification', notifHTML); }})然后,该事件仅发送给我希望它成为的客户端,即我展示的房间中的那个客户端。(如果一个用户从多个浏览器连接到服务器,这个房间可能包含多个客户端,所以我不能用代码替换这个房间代码来定位单个套接字。)但是,代码不应该如此冗长;我仍然想知道为什么 .to 没有按照我期望的方式工作。据我从阅读文档中得知,它应该提供相同的功能,即仅向指定房间中的套接字发出事件。
2 回答
牛魔王的故事
TA贡献1830条经验 获得超3个赞
使用.to
代替.in
io.of('/').to(userID.toString()).emit('notification', notifHTML);
添加回答
举报
0/150
提交
取消