尽管 .to(room),但 Socket.io 仍向所有用户发送

我有一个 node.js 服务器,它使用 Socket.io 向客户端发出事件。当连接事件发生时,新的套接字会根据连接用户的 id 放置在房间中,该 id 使用来自 的会话 id cookie 获取socket.headers.handshake.cookie。我知道这部分正在工作,因为我可以设置断点并检查io.sockets.adapter.rooms并查看这个房间:

http://img2.mukewang.com/6155808600014d9305180078.jpg

所以,房间里显然只有一个插座。同样在此断点处暂停时,以下表达式: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 没有按照我期望的方式工作。据我从阅读文档中得知,它应该提供相同的功能,即仅向指定房间中的套接字发出事件。


尚方宝剑之说
浏览 215回答 2
2回答

牛魔王的故事

使用.to代替.inio.of('/').to(userID.toString()).emit('notification',&nbsp;notifHTML);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript