Javascript 从socket.io获取断开连接的用户

Javascript 从socket.io获取断开连接的用户,javascript,node.js,sockets,Javascript,Node.js,Sockets,我正在Node.js中编写一个实时聊天系统。在用户连接到服务器的地方,我正在创建唯一的散列密钥[一次性创建],并加入他在新的聊天室。我想显示用户是否在线。当用户断开套接字连接时,我无法获得用户的聊天室,因此我无法找到用户是否在线。请告诉我有没有更好的办法 Server.js socket.on('newUser',function (user) { chat.createChatRoom(con, user.email, user.phone, function (res,user_id

我正在Node.js中编写一个实时聊天系统。在用户连接到服务器的地方,我正在创建唯一的散列密钥[一次性创建],并加入他在新的聊天室。我想显示用户是否在线。当用户断开套接字连接时,我无法获得用户的聊天室,因此我无法找到用户是否在线。请告诉我有没有更好的办法

Server.js

socket.on('newUser',function (user) {
    chat.createChatRoom(con, user.email, user.phone, function (res,user_id,chatToken) {
        chatToken="TOK"+chatToken; //Here we using TOK for some identical purposes
        chatRoom(socket,chatToken,1);
        io.sockets.in(chatToken).emit('newUser', {chatToken:chatToken,user_id:user_id,response:res,rooms:io.sockets.adapter.rooms});
        io.emit('userConnects',chatToken);
        console.log(JSON.stringify(io.sockets.adapter.rooms));

    });
});
创建聊天室功能:

var createChatRoom = function (con, email, phone,callback) {
var chatToken = require('crypto').createHash('md5').update(email).digest("hex");
con.query("SELECT * FROM USER WHERE `email`='" + email + "'", function (error, result) {
    if (error) throw error;
    if (result.length == 0) {
        con.query("INSERT INTO user(email,chat_token,phone) VALUES('" + email + "','" + chatToken + "','" + phone + "')", function (error1, result1) {
            return callback(1,result1.insertId,chatToken);
        });
    } else {
        return callback(0,result[0].user_id,chatToken);
    }
});
};

当用户断开连接时,我想获取聊天令牌。但是我只能获取套接字id。

创建新聊天用户时,还需要将socket.id存储在新用户的新列中。然后,当用户断开连接时,可以通过socket.id搜索用户

chat.createChatRoom(con, socket.id, user.email, user.phone, function (res,user_id,chatToken) {...})

实际上,如果唯一的目的是识别套接字连接,您甚至不需要自己创建聊天令牌。因为socket.id是每个套接字连接的随机、不可用、唯一标识符。

检测用户是否断开连接的最佳方法是首先在套接字会话中设置用户名

socket.on('newUser',function (username) {
            // we store the username in the socket session for this client
            socket.username = username;
});
当用户断开连接时,请在断开连接事件中找到

socket.on('disconnect', function () {
    var connectionMessage = socket.username + " Disconnected from Socket " + socket.id;
    console.log(connectionMessage);
  });

我想要一个独特的和永久的聊天令牌,以便我可以触发新的消息。套接字id是随机的,因此我可以找到哪个用户已断开连接。@SarathKumar每个聊天室都可以连接多个套接字(用户),因此最好将属于聊天室的用户持久保存在另一个表中。因此,您可以在用户加入或断开连接时添加和删除用户(使用socket.id标识文件室成员)。房间不会断开,用户会断开。而且,您可以使用聊天令牌向聊天室的所有成员进行广播。但在这里,我将为每个客户端创建单独的聊天室。发送私人消息。然后在数据库中同时包含chatToken和socket.id。但是,您需要在每次用户连接时更新数据库中的socket.id,并在用户断开连接时将其删除。您的意思是,我必须将socket.id更新为chatToken。这样我就可以知道哪个用户断开了连接。