如果使用Node.js在Socket.io中的应用程序中登录功能,则为特定用户发出事件

时间:2019-01-13 14:16:36

标签: javascript node.js websocket socket.io

我使用了socket.onio.emit方法,并且得到了所有用户的回应。但是,我想得到特定用户的回复。

但是我的应用程序包含登录功能,我在stackoverflow上关注了this个帖子,他们说我们需要在对象中使用唯一的userIdsocketId 特定用户为特定用户发出事件。 但是我在登录后得到了userId ,但是当用户连接到应用程序时我们想要它。

那么有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

  1. 在您的node.js中,创建一个全局数组'aryUser',每个元素都包含socketid和loginid。

  2. node.js onConnect(新连接),使用套接字id将新元素添加到数组中,并设置loginid = empty。

  3. 用户登录后,从客户端向服务器发出事件,例如:

socket.emit('userloginok',loginid)

  1. 在node.js中,定义一个函数:

socket.on('userloginok',loginid)

,然后在此函数中,用socketid搜索aryUser,并将数组元素中的空loginid替换为parm loginid。

  1. 在node.js中,定义函数:

socket.on('disconnect')

在此功能中,搜索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

答案 1 :(得分:0)

是的,您肯定需要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并发送消息,

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

P.S。您可以从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
 });

在服务器端,使用socketId从缓存中获取UserId。从缓存中获取socketId后,请发送类似这样的特定消息,

io.to(socketId).emit(`message-response`, {
    message: 'hello'
 });

希望这会有所帮助。