node.js - 你可以依赖socket.id作为UID吗

标签 node.js express socket.io

请原谅我的无知,node.js/socket.io 的第二天

我正在寻找一种方法来唯一标识在数据库排队系统中使用的用户。我读了很多关于使用 Express session cookie 的内容,但是我注意到 socket.id 似乎是 socket.io 已经在使用的 UID。

因此,我一直在数据库中使用 socket.id 来识别我的用户,并创建私有(private)“房间”来与他们进行通信。

这是一个糟糕的主意吗?

最佳答案

套接字 ID 就是这样 - 它唯一地标识一个套接字。它不能唯一地标识用户,并且绝对不打算用于此目的。单个用户(在许多应用程序中)可能有多个连接(因此有多个具有不同 ID 的套接字)。此外,每次连接时,他们都会被分配一个新的 ID。

因此,您显然不应该使用 socket.id 作为用户 ID。 Mustafa 指出您可以将 socket.id 重新分配给用户 ID,但我倾向于认为这是一个非常糟糕的主意,原因有两个:

  1. socket.id 应该唯一标识一个套接字,因此当单个用户打开多个套接字时,您会遇到问题。
  2. Socket.IO 在内部大量使用该 ID 将内容存储在哈希表中,如果更改 ID,可能会得到意外的结果并且很难追踪错误。我还没有测试过它,但是查看 Socket.IO 源代码,这就是我所期望的。

最好使用其他方法生成 ID,然后将用户与套接字关联(例如,在握手期间使用 cookie 中的数据)。

socket.set(key, value,callback) 是明确用于将您自己的数据(如用户 ID)与套接字连接相关联的方法,并且是唯一有保证的方法为了安全起见。

关于node.js - 你可以依赖socket.id作为UID吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15989514/

相关文章:

javascript - Node.js 以管理员身份启动程序

javascript - Azure 应用服务在 URL 中添加 '/'

node.js - 无法提供具有快速路由且没有斜杠的静态文件

javascript - 为什么 socket.io 为一个事件返回多次

node.js - http.Server 的 'connect' 事件从未被调用

node.js - Go 中的 channel 和 node.js 中的发射器?

javascript - 如何在EJS文件中使用setInterval?

node.js - neo4j.ClientError : [Neo. ClientError.Security.Unauthorized]

node.js - 关闭node js登录后弹出的窗口

node.js - node.js 子进程中的 socket.io-client Web 套接字连接失败