我用的是NodeJS、快车把和Socket.IO.我使用uuid和套接字io创建了一个简单的特性,并希望创建持久房间.因为我想以干净的方式使用它,所以我构建了控制器.我不知道这是不是一个好主意,但不知何故,当我刷新页面时,套接字控制器会执行里面的代码……这将在我的数据库中产生严重的问题.
- I started by creating the main events in server.js file:个
const server = http.createServer(app);
const io = new Server(server);
io.on('connection', socket => {
//User look for user and send invitation to chat
lookForUserAndInvite(socket);
//Rooms creation
createASingleRoom(socket);
});
- Than, I sent the functions in the controller, serverside:个 这里将从客户端接收数据对象. 这是我想要存储在我的MongoDB中的对象. 另外,这个is getting executed twice
const createASingleRoom = socket => {
socket.on('create_room', data => {
const roomObject = {
roomId: uuidv4(),
author: data.author,
invitedUsers: data.invitedUsers || []
};
console.log('server', roomObject); //Logged this. This creates a new room each time I will refresh the page
})
}
export default createASingleRoom;
- 我在这里使用了快速车把,所以我导入了io库CDN.
在这里,我从我的服务器端点获取用户数据,并发出事件
create_room
.现在,我只用一个数组填充它.
<script src="/socket.io/socket.io.js"></script>
<script>
const handlereateRoom = () => {
socket.emit('create_room', {
roomId: roomName,
author: user._id,
invitedUsers: ['numero1', 'numero2']
});
}
document.addEventListener('DOMContentLoaded', async () => {
//Execute this only after the document is fully loaded
//Get the main user
user = await fetchData();
let url = window.location.origin + '/signup';
//Get dom elements
const roomName = document.querySelector('#roomName').value;
if (user) {
handlereateRoom()
}
});
</script>
我看到,每次刷新页面时,我都会得到一个新的连接ID集,因此我也会得到一个新的UUID(一个完全不同的对象).所以我得到了一个新的插座和一个新的对象.
7spvSFlQ9YJubmgrAAAD
server {
roomId: '6b20f71b-23ad-48d8-9a20-db8a78ae4dc8',
author: '65b41b7c389a60d75ed9a2f3',
invitedUsers: [ 'numero1', 'numero2' ]
}
EHdSu_RuZzkc7_8nAAAF
server {
roomId: 'f641a9fc-0fa0-4b65-9186-c782a25fab57',
author: '65b41b7c389a60d75ed9a2f3',
invitedUsers: [ 'numero1', 'numero2' ]
}