[英]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.