在socket.io中管理多个选项卡(但相同的用户)

Mig*_*uel 20 javascript session node.js socket.io

我有一些socket.io的问题,我不知道如何解决它.我有一个带有socket.io的登录系统的应用程序来管理用户交互.我还有一个数组来管理所有活动的websocket会话.此数组存储一对session.id => username.

当用户打开具有相同页面的新选项卡(或使用websocket的不同页面)时,问题就开始了.这会导致数组中的用户名条目重复.

{id1, username}
{id2, username}
Run Code Online (Sandbox Code Playgroud)

当套接字向用户发送消息时,它仅发送到该阵列的第一个会话ID,因此只有一个选项卡接收该消息.

我试图更改新连接的套接字ID以匹配另一个,但它不起作用.

socket.id = sessionId of the other websocket;
Run Code Online (Sandbox Code Playgroud)

我认为另一种解决方案是将消息发送到所有打开的会话,但我认为这不是最好的方法.

谢谢.

Tim*_*ple 29

听起来你可能是指你问题中的套接字ID,而不是会话ID.如果您有快速会话,则可以使用会话ID,无论打开多少个选项卡,只要它们使用相同的浏览器并且它不处于"私有"模式,它就会相同.看看这个问题,了解如何在socket.io中启用会话.

socket.io和session?

更新: 当您保存会话ID时,您将其与用户的昵称和连接的套接字关联.然后,您可以遍历每个套接字并发送消息.类似于以下内容:

[
    {sessionId: '12345', nickname: 'timmay!', socketIds: [1, 2, 3]},
    {sessionId: '23456', nickname: 'pete', socketIds: [4, 5, 6]}
]
Run Code Online (Sandbox Code Playgroud)

建立另一个连接时,将新的套接字ID推入socketIds数组,当用户断开连接时,删除id.

另一个选项可能是每个会话仅允许每个用户使用一个选项卡.您可以存储单个socketId,当新套接字连接到同一用户时,您可以断开原始套接字并使用新套接字.