[英]Emit event for particular user if login functionality in application in Socket.io with Node.js
我已經使用方法socket.on
和io.emit
,我得到了所有用戶的回應。 但是,我想得到特定用戶的回應。
但是我的應用程序包含登錄功能,我在stackoverflow上關注了這篇文章,他們說我們需要特定對象中的對象中唯一的userId
和socketId
才能為特定用戶發出事件。 但是我在登錄后得到了userId ,但是當用戶連接到應用程序時我們想要它。
所以有人可以幫我嗎?
在您的node.js中,創建一個全局數組'aryUser',每個元素都包含socketid和loginid。
node.js onConnect(新連接),使用socketid將新元素添加到數組,並設置loginid = empty。
用戶登錄后,從客戶端向服務器發出事件,例如:
socket.emit('userloginok',loginid)
socket.on('userloginok',loginid)
然后在此函數中,用socketid搜索aryUser,並將數組元素中的空loginid替換為parm loginid。
socket.on( '斷開')
在此函數中,搜索aryUser,使用aryUser.splice(i,1)刪除剛剛斷開連接的用戶。
這意味着aryUser包含所有已連接的用戶,其中一些已登錄,其中一些未登錄。 您可以使用數組的套接字ID向特定用戶和/或所有用戶發送消息。
示例源代碼:
http://www.zephan.top/server.js
http://www.zephan.top/server.html.txt
將server.html.txt重命名為server.html,將server.html和server.js放在同一目錄中,然后運行:
節點server.js
是的,您肯定需要socketId
才能在兩個特定用戶之間發送和接收消息。
僅需要UserId
即可跟蹤與特定用戶相關聯的socketId
,或者您也可以通過其他方式來管理它。
根據您的問題,您具有該用戶的userId
,並且需要該用戶的socketId
! 因此,在這種情況下,您可以在該特定對象從客戶端連接到套接字服務器時傳遞userId
,如下面的代碼段所示,
const socket = io(this.SOCKET_SERVER_BASE_URL, { query: `userId=${userId}` });
您可以像這樣在nodejs服務器上讀取該用戶,
const userId= socket.request._query['userId'],
const socketId= socket.id
現在,將此socketId
存儲在某個地方,例如Redis或由您決定的某種緩存機制,只需確保獲取和檢索應該很快。
現在,在發送消息時, socketId
使用以下代碼從您的緩存中提取socketId
並在該socketId
上發出消息,
io.to(socket.id).emit(`message-response`, {
message: 'hello'
});
我已經在Angular和AngularJs上撰寫了有關此主題的完整博客文章,您也可以參考它們。
編輯1:
第1部分=>當您的用戶完成登錄請求時,然后建立與套接字服務器的連接。 假設您正在使用React或Angular成功登錄后,您將把用戶重定向到home組件(頁面)。 在Home組件(頁面)上,通過像這樣傳遞userId
使套接字服務器連接,
const socket = io(SOCKET_SERVER_BASE_URL, { query: `userId=${userId}` });
PS,您可以從URL獲得用戶ID,也可以使用取決於您的Cookie。
在服務器上收到此套接字連接請求后,即可讀取userID
查詢,並獲取與之關聯的socketId並將其存儲在緩存中,如下所示:
io.use( async (socket, next) => {
try {
await addSocketIdInCache({
userId: socket.request._query['userId'],
socketId: socket.id
});
next();
} catch (error) {
// Error
console.error(error);
}
});
第2部分=>現在,假設您有一個客戶端用戶列表,並且想向特定用戶發送消息。
socket.emit(`message`, {
message: 'hello',
userId: userId
});
在服務器端,使用UserId
從緩存中獲取socketId
。 從緩存中獲取socketId后,請發送類似的特定消息,
io.to(socketId).emit(`message-response`, {
message: 'hello'
});
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.