我用nodejs和socket.io构建了一个聊天Web应用程序。我也有一个登录/注销系统。
问题是我有一个socket.on('disconnect')
正在更改会话中的某些数据,并且似乎与注销过程冲突。
简而言之,当用户进入聊天室时,我呼叫socket.emit('new_user')
。然后,将该用户添加到当前在聊天室中的用户列表,或者如果他已经在图标中,那么他的图标将从黄色变为绿色。
当用户离开聊天室时(只需通过更改页面或关闭选项卡),将触发socket.on('disconnect')
,它会更改会话中的用户状态并为聊天中其他用户更改用户的颜色从绿色到黄色的房间。
所有这些都运行良好。
我唯一的问题是在注销期间。
我有一个简单的app.get('/logout')
,它会破坏会话。但是随后,似乎socket.on('disconnect')
被调用,而初始的req.session.destroy();
被忽略了。因此用户仍处于登录状态。
如果我删除了socket.on('disconnect')
,则注销过程可以正常工作,但是当用户更改页面或关闭选项卡时,用户的状态没有改变(显然...)
我正在寻找一种方法来保持我的“可用/离开”状态更改并能够注销。
这是app.js文件的某些部分:
var session = require("express-session")({
secret: "my-secret",
resave: false,
saveUninitialized: false,
});
var sharedsession = require("express-socket.io-session");
app.use(express.static('public'));
app.use(session);
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
io.use(sharedsession(session));
app.get('/logout', function(req, res, next) {
req.session.destroy();
res.redirect('/');
});
io.sockets.on('connection', function(socket) {
// As soon as a user enter the chat room, change his state and update other users.
socket.on('new_user', function() {
username = socket.handshake.session.username;
socket.handshake.session.state = 'available';
socket.handshake.session.save();
socket.broadcast.emit('new_user', username);
socket.broadcast.emit('userjoin', { username: username });
console.log(username + ' joined the chat!');
});
// As soon as we receive a message show the username and message to the other users and store it in the database.
socket.on('my_message', function(message) {
//message = ent.encode(message);
socket.broadcast.emit('other_message', { username: socket.handshake.session.username, message: message });
var sql = "INSERT INTO chat_log (user, msg) VALUES (" + conn.escape(socket.handshake.session.username) + ", " + conn.escape(message) + ")";
conn.query(sql, function(err, result) {
if (err) throw err;
});
});
//When a user is leaving (changing page, cloasing tab...) change his state and sho it to the others
socket.on('disconnect', function() {
username = socket.handshake.session.username;
socket.broadcast.emit('userleave', { username: username });
socket.handshake.session.state = 'away';
socket.handshake.session.save();
console.log(username + ' is gone!');
});
谢谢!