如何判断用户是否从Socket.io事件进入站点

时间:2017-07-07 18:09:05

标签: node.js sockets express socket.io

我正在使用快速会话将用户登录到我的网站。当他们登录后,我可以访问他们的req.user,其中包含有关用户的信息,如用户名,帐户年龄等。

问题是我需要能够在socket.io事件处理程序内检查用户是否已登录

io.sockets.on('connection', function (socket) {
   console.log(socket.request.session.id);
   io.sockets.on('message', function (socket) {
       //check if user is logged on here and if so broadcast the message to sockets
   })
});

正如你所看到的,我需要能够访问req.user这是我无法访问的,因为它在socket.io事件处理程序中,有没有其他方法可以告诉用户是否已登录?

1 个答案:

答案 0 :(得分:0)

嗯...说实话我仍然不是100%清楚你在做什么,但是你也可以直接使用套接字来代替使用用户(因为你似乎不需要其他用户数据)除了他们的登录状态):

1)您正尝试从连接的套接字向所有其他连接的套接字(即从登录用户发送给其他登录用户)发送消息

在这种情况下,您可能会在客户端javascript中的某个地方实例化一个套接字,这样每个新客户端都会打开一个新的套接字。

因此,为确保所有可用的套接字都是登录客户端,您可以在登录功能中放置用于打开新套接字的代码,只需将服务器broadcast用于除发件人之外的所有连接套接字:

io.sockets.on('connection', function (socket) {
    console.log(socket.request.session.id);
    io.sockets.on('message', function (data) {
        //check if user is logged on here and if so broadcast the message to sockets
      socket.broadcast.emit('message', data);
    })

});

2)您正尝试将消息从一个套接字发送到另一个连接的套接字(即从一个用户发送到另一个特定登录用户)

同样,只在登录过程中/之后打开套接字。

然后,在您的客户端,您可以执行以下操作:

socket.emit('message', "target_id");

以便在服务器端执行:

socket.on("message", function(id) {
       socket.to(id).emit("message");
}

这有什么用?