Node.js Socket.io在刷新时断开连接?

Node.js Socket.io在刷新时断开连接?,node.js,mongodb,sockets,socket.io,Node.js,Mongodb,Sockets,Socket.io,我正在尝试建立一个实时聊天,我使用mongodb和socket.io来存储消息和用户 创建新用户时,该用户存储在mongodb和socket对象中 如果用户刷新页面,则该用户将从套接字对象中删除,这意味着现在为了让该用户返回,他们必须创建一个新用户名并生成一个新套接字 下面是我的服务器端代码 /* |-------------------------------------------------------------------------- | Live socket communicat

我正在尝试建立一个实时聊天,我使用mongodb和socket.io来存储消息和用户

创建新用户时,该用户存储在mongodb和socket对象中

如果用户刷新页面,则该用户将从套接字对象中删除,这意味着现在为了让该用户返回,他们必须创建一个新用户名并生成一个新套接字

下面是我的服务器端代码

/*
|--------------------------------------------------------------------------
| Live socket communication with front end:
|--------------------------------------------------------------------------
|
|
*/

var users = {};

io.sockets.on('connection', function (socket) {

    // Listen to a new user then emit the user to all clients
    socket.on('new user', function (data) {

        // Check mongodb to see if the user exists and emit proper message
        models.Message.findOne({username:data},function(err,user){
            if(err){
                console.log('something went wrong')
            }
            else if(user){
                socket.emit('username taken', 'something');
            }
            else{
                socket.emit('create user', data);
                socket.userName = data;
                socket.connected = true;
                users[socket.userName] = socket;
                io.sockets.emit('user name', Object.keys(users));
            }
        });

    });

    socket.on('facebook id', function(data) {

        models.User.findOne({username:data.name}, function(err, user) {
            if (user) {
                console.log('User already exists');
                socket.userName = data.name;
                socket.facebook_id = data.id;
                socket.connected = true;
                users[socket.userName] = socket;
                io.sockets.emit('user name', Object.keys(users));
            } 
            else {
                var newUser = new models.User({
                    username: data.name,
                    facebook_id: data.id
                });
                newUser.save(function(err, user) {
                    console.log('successfully inserted user/user: ' + user._id);
                });
            }
        });

    });

    // Listen to a new message then emit the message to all clients
    socket.on('send message', function (data, callback) {

        io.sockets.emit('new message', {message: data, username: socket.userName, facebook_id: socket.facebook_id});

    });

    // Logic when client disconnects
    socket.on('disconnect', function (data) {

        if(!socket.userName) return;
        seeder.disconnect(socket.userName);
        delete users[socket.userName]
        io.sockets.emit('user disconnected', Object.keys(users));

    });

});
您可以看到,在断开连接中,我从users对象中移除了套接字

我的问题是,有没有办法在断开连接时保存套接字信息,然后如果同一个套接字尝试连接,请让它识别用户并继续


补充:我在想,也许我需要先用mongodb创建一个用户登录,然后使用该登录会话数据并将其传递给套接字,创建一个包含当前数据库详细信息的套接字对象?这听起来更有意义吗,可能吗?

您可以使用cookies来识别用户。生成一个随机散列,将其放入cookies中,这样,在客户端和服务器之间建立连接时,这些数据将被传输

客户端代码可能如下所示:

function generateHash(len) {
  var symbols = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
  var hash = '';
  for (var i = 0; i < len; i++) {
    var symIndex = Math.floor(Math.random() * symbols.length);
    hash += symbols.charAt(symIndex);
  }
  return hash;
}
if (!/\buser_id=/.test(document.cookie)) { //if no 'user_id' in cookies
  document.cookie = 'user_id=' + generateHash(32);  //add cookie 'user_id'
}

//here goes establishing connection to server via `io.connect`
因此,您有
userId
变量,该变量对于每个用户都是唯一的。然后,您可以对该行进行注释:

delete users[socket.userName]
因为你应该保留用户数据


现在,您可以将
users
对象与
userId
(非username)作为键存储,并在每个连接上检查
users[userId]!=空
。如果存在这样的用户,请使用他们的套接字信息

我实际上找到了本教程,我将尝试将套接字与我在这里学到的内容合并。以上内容绝对有助于理解我如何利用cookies。
delete users[socket.userName]