【发布时间】:2014-04-30 22:53:03
【问题描述】:
我正在尝试构建实时聊天,我正在使用 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 创建用户登录,然后使用该登录会话数据并将其传递给套接字,使用当前数据库创建套接字对象细节?这听起来是不是更有意义,这可能吗?
【问题讨论】:
标签: node.js mongodb sockets socket.io