【问题标题】:socket.io chat add user name to disconnectsocket.io 聊天添加用户名断开连接
【发布时间】:2021-04-07 14:09:00
【问题描述】:

我是 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。我猜我需要在客户端发出它以断开连接?这似乎应该很容易,但给我带来了问题。

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: javascript node.js socket.io message


    【解决方案1】:
      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
           });
      })
    
    

    【讨论】:

      【解决方案2】:

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

      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];
          })
      })
      

      由于您没有存储事件有效负载,因此我将其存储在对象“用户”中。您也可以将其存储在缓存中

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-14
        • 2017-07-17
        • 2021-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-30
        • 1970-01-01
        相关资源
        最近更新 更多