2013-04-13 35 views
1

請原諒我的無知,node.js中的第2天/ socket.io你可以依靠socket.id作爲UID

我正在尋找一種方式來唯一地標識用戶在數據庫排隊系統。我讀了很多關於使用Express的會話cookie,但我注意到socket.id似乎是socket.io已經使用的UID。

所以我一直在使用socket.id,以確定我的用戶都在數據庫中,並在創建私有「房間」只有他們溝通。

這是一個可怕的想法?

+0

對我來說,最大的問題是,這會在同時運行的多個實例中獨一無二嗎? – kroe

回答

4

套接字ID只是 - 它唯一地標識一個插座。它不能唯一標識一個用戶,並且絕對不打算用於此目的。一個用戶(在許多應用程序中)可能有多個連接(因此多個套接字使用不同的ID)。而且,每次連接時,他們都會被分配一個新的ID。

很顯然你不應該使用一個socket.id作爲用戶ID。穆斯塔法指出,你可以重新分配socket.id用戶ID,但我傾向於認爲這是一個非常糟糕的主意,原因有二:

  1. socket.id應該是唯一標識一個插座,所以你會碰到問題時,單用戶打開多個套接字。
  2. Socket.IO,使用該ID在內部大量存儲在哈希表的東西,如果你改變了ID,你可能會得到意想不到的效果,難以追查錯誤。我沒有測試過,但看着Socket.IO源碼,這就是我所期望的。

更好地使用其他方法生成ID,然後將用戶與套接字相關聯(例如,在使用cookie中的數據握手期間)。

socket.set(key, value, callback)是明確打算用於將您自己的數據(如用戶ID)與套接字連接相關聯的方法,也是唯一保證安全的方法。

+0

感謝您的信息!對於我正在解決的問題,多個選項卡/會話不是問題,所以很高興聽到我可以將其用於此目的。不過,如果需要識別/保留多個會話,我會考慮使用Cookie。 – Titan

1

當創建socket.io插座,你可以如你所願的Socket對象添加變量。 socket.userid = getUserID()會正常工作。最好在數據庫中設置UID,並在認證成功時將它們添加到套接字對象中。

相關問題