1

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

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

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

这是一个可怕的想法吗?

4

2 回答 2

6

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

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

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

最好使用另一种方法生成 ID,然后将用户与套接字相关联(例如,在握手期间使用来自 cookie 的数据)。

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

于 2013-04-13T17:30:24.770 回答
1

创建 socket.io 套接字时,您可以根据需要向套接字对象添加变量。socket.userid = getUserID()会正常工作。最好在数据库中分配 UID,并在身份验证成功时将它们添加到套接字对象中。

于 2013-04-13T17:20:59.663 回答