我正在使用快速会话将用户登录到我的网站。当他们登录后,我可以访问他们的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事件处理程序中,有没有其他方法可以告诉用户是否已登录?
答案 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");
}
这有什么用?