我正在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);
}
});
};
当用户断开连接时,我想获得 chatToken 。但我只能获得套接字ID。
答案 0 :(得分:1)
在创建新的聊天用户时,您还需要将socket.id存储在新用户的新列中。然后,当用户断开连接时,您可以通过socket.id搜索用户。
chat.createChatRoom(con, socket.id, user.email, user.phone, function (res,user_id,chatToken) {...})
实际上,如果唯一的目的是识别套接字连接,您甚至不需要自己创建聊天令牌。因为socket.id是每个套接字连接的随机,不可取的唯一标识符。
答案 1 :(得分:0)
检测用户是否断开连接的最佳方法是首先在套接字会话中设置用户名
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);
});