gpt4 book ai didi

node.js - 刷新时Socket.io断开连接?

转载 作者:行者123 更新时间:2023-12-03 11:52:07 26 4
gpt4 key购买 nike

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

创建新用户时,该用户将存储在mongodb和套接字对象中。

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

这是我的服务器端代码的样子

/*
|--------------------------------------------------------------------------
| 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));

});

});

您会在断开连接中看到我从用户对象中删除了套接字。

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

附加组件:我在想,我可能首先需要重点关注使用mongodb创建用户登录名,然后使用该登录 session 数据并将其传递给套接字,从而创建具有当前数据库详细信息的套接字对象?这听起来更有意义吗,这可能吗?

最佳答案

您可以使用cookie来识别用户。生成随机哈希,将其放入cookie中,因此在客户端与服务器之间建立连接时将传输此数据。

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

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`

在服务器端,您可以编写:
io.sockets.on('connection', function (socket) {
var cookie = socket.handshake.headers.cookie;
var match = cookie.match(/\buser_id=([a-zA-Z0-9]{32})/); //parse cookie header
var userId = match ? match[1] : null;
//...

因此,您拥有 userId变量,该变量对于每个用户而言都是唯一的。然后,您可以对此行发表评论:
delete users[socket.userName]

因为您应该保留用户数据。

现在,您可以将 users对象存储为 userId(而非用户名)作为键,并在每个连接上检查 users[userId] != null是否为。如果存在该用户,请使用其套接字信息

关于node.js - 刷新时Socket.io断开连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22594897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com