簡體   English   中英

如果使用Node.js在Socket.io中的應用程序中具有登錄功能,則為特定用戶發出事件

[英]Emit event for particular user if login functionality in application in Socket.io with Node.js

我已經使用方法socket.onio.emit ,我得到了所有用戶的回應。 但是,我想得到特定用戶的回應。

但是我的應用程序包含登錄功能,我在stackoverflow上關注了這篇文章,他們說我們需要特定對象中的對象中唯一的userIdsocketId才能為特定用戶發出事件。 但是我在登錄后得到了userId ,但是當用戶連接到應用程序時我們想要它。

所以有人可以幫我嗎?

  1. 在您的node.js中,創建一個全局數組'aryUser',每個元素都包含socketid和loginid。

  2. node.js onConnect(新連接),使用socketid將新元素添加到數組,並設置loginid = empty。

  3. 用戶登錄后,從客戶端向服務器發出事件,例如:

socket.emit('userloginok',loginid)

  1. 在node.js中,定義一個函數:

socket.on('userloginok',loginid)

然后在此函數中,用socketid搜索aryUser,並將數組元素中的空loginid替換為parm loginid。

  1. 在node.js中,定義函數:

socket.on( '斷開')

在此函數中,搜索aryUser,使用aryUser.splice(i,1)刪除剛剛斷開連接的用戶。

這意味着aryUser包含所有已連接的用戶,其中一些已登錄,其中一些未登錄。 您可以使用數組的套接字ID向特定用戶和/或所有用戶發送消息。

示例源代碼:

  1. server.js

http://www.zephan.top/server.js

  1. server.html

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'
 });

我已經在AngularAngularJs上撰寫了有關此主題的完整博客文章,您也可以參考它們。

編輯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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM