将socket.io ID与express和passport链接

将socket.io ID与express和passport链接,express,socket.io,passport.js,Express,Socket.io,Passport.js,我的简单尝试的目标是显示在线用户列表。我的意思是显示用户配置文件而不是socket.io ID。当授权用户连接到我的服务器时,打开socket.io通道,需要获取他的个人资料并向其他连接的用户发送新用户(姓名、电子邮件等)已连接的消息。我看到了许多如何在授权范围内执行此操作的示例,但它不能处理断开连接。在伪代码中我想做什么和不能做什么: var io = require("socket.io").listen(server); io.set("authorization", function(d

我的简单尝试的目标是显示在线用户列表。我的意思是显示用户配置文件而不是socket.io ID。当授权用户连接到我的服务器时,打开socket.io通道,需要获取他的个人资料并向其他连接的用户发送新用户(姓名、电子邮件等)已连接的消息。我看到了许多如何在授权范围内执行此操作的示例,但它不能处理断开连接。在伪代码中我想做什么和不能做什么:

var io = require("socket.io").listen(server);
io.set("authorization", function(data, callback){
     // ... some code...
     callback(null, true);
});

io.sockets.on('connection', function (socket) {
    var UserProfile = passport.getUserProfile(socket.id) 
    io.sockets.emit('user_connected', {UserProfile: UserProfile, socketID: socket.id}); 

    io.sockets.on('disconnect', function (socket) {
         io.sockets.emit('user_disconnected', {socketID: socket.id});
    }); 

}); 
这是一个伪代码

我的书堆满了。我只想在连接中将socket.io ID和passport帐户链接在一起。我该怎么做呢?

我也遇到了同样的问题,我的解决方案如下(希望有人有更好的想法):

  • 我将用户名添加到渲染调用(使用jade): res.render('聊天室',{username:req.user.username})
  • 在连接到客户机上的套接字(io.connect)之后,我立即发出 使用客户端上的connect事件(socket.on('connect',function(data){…}),将用户名作为参数发送给服务器的消息
  • 在服务器上,我将用户名存储在一个对象中(clients[socket.id] =用户名)
  • 之后,我通过访问每个套接字消息来获取用户名 客户反对

great-answer@luschn…快速问题这行代码有效地为客户机[socket.id]=用户名是使用括号符号为对象分配属性吗?是的,在这种情况下不能使用点符号(clients.socket.id将完全不同)。基本上,它将套接字id作为关联数组/对象中的键,并使用用户名作为值。