socket.io聊天添加用户名断开连接

socket.io chat add user name to disconnect

我是 socket.io 的新手。我一直在研究这个消息聊天。当用户登录并提交消息时,我能够将用户名添加到聊天中,但对于我来说,当用户断开连接时,我无法让它读取用户名。也许我在这方面工作的时间太长了,但答案不应该那么难,因为我有用于连接和提交的用户名。

这是我在客户端的。

socket.on('connect', () => {
        // emiting to everybody  
        socket.emit('join', { room: room, name: name });    
      })

name 保存登录的用户名。

在服务器端我有这个。

socket.on('join', (data) => {    
    socket.join(data.room); 
    tech.in(data.room).emit('message', `${data.name} joined ${data.room} room!`);
})

socket.on('disconnect', (data) => {
    console.log('user disconnected');
    tech.emit('message', 'user disconnected' + data.name );
})

连接工作正常,当用户连接时,我得到用户名已加入房间,但对于断开连接“用户断开连接未定义”,我得到未定义。不识别 var。我猜我需要发出它以在客户端断开连接?这看起来应该很容易,但给我带来了问题。

如有任何帮助,我们将不胜感激。谢谢

  io.use((socket: any, next: any) => {
     //you can do authentication in this middleware
     // you can also validate query data here => socket.handshake.query
     if (authenticated){
         socket.data.groupid = socket.handshake.query.groupid;
         next();
     }else{
         return new Error('Authentication error')
     }
  })
  .on('connection',socket:any) => {

       socket.join(socket.data.groupid, () => {
          // you can join the room from inside here
       });
     
       socket.on('disconnect', () => {
         //you can handle disconnect event here
       });
  })

在服务器端,你可以这样做:

let users = {}
io.of('/test').on('connection', (socket) => {
    
    socket.on('join', (data) => {
        socket.join(data.room);
        
        users[socket.id] = data;

        io.of('/test').to(data.room).emit('message', `${data.name} joined ${data.room} room!`);
    })
    
    socket.on('disconnect', () => {
        io.of('/test').emit('message', 'user disconnected ' + users[socket.id].name);
        delete users[socket.id];
    })
})

由于您没有存储事件负载,所以我将其存储在一个对象中 'users'。您也可以将其存储在缓存中

另外我想提一下 disconnect 事件不支持参数。您可以参考下面的link。 https://socket.io/docs/v3/client-api/#socket-disconnect