我正在node.js
和socket.io
创建聊天。
当用户打开我的应用程序时,我会ping服务器并要求它让用户加入特定的房间并设置一个随机用户名(可以在以后编辑)。
我用这个
io.on('connection', (socket) => {
socket.on('join room', (roomId, callback) => {
// leave and join room
if (socket.roomId) {
socket.leave(socket.roomId);
}
socket.roomId = roomId;
socket.join(roomId);
// set username
if (!socket.username) {
socket.username = getRandomUsername();
}
});
});
它似乎有效,但我遇到过应用程序长时间运行的情况,突然用户的用户名发生了变化。
我怀疑这种情况发生是因为用户已断开连接,socket.io
已尝试重新连接。当用户重新连接时,原始套接字丢失(因此它没有用户名),并为新套接字分配了一个新用户名,该用户名将覆盖原始客户端套接字。
我的代码是否存在问题,方法是为用户分配一个随机用户名?当用户未登录时,它会以某种方式与Google Docs相同(他们通常会为您提供动物的名字)。
我该如何解决这个问题?我非常想避免使用cookies。一个选项可能是告诉客户端它丢失了连接,它必须重新加载页面,然后要求服务器获得相同的用户名。
我已使用以下代码在客户端上保存指定的用户名:
const socket = io();
let username = null;
socket.on('connect', function() {
socket.emit('join room', roomId, function (newUsername) {
username = newUsername;
});
});
(...)