我用的是NodeJS、快车把和Socket.IO.我使用uuid和套接字io创建了一个简单的特性,并希望创建持久房间.因为我想以干净的方式使用它,所以我构建了控制器.我不知道这是不是一个好主意,但不知何故,当我刷新页面时,套接字控制器会执行里面的代码……这将在我的数据库中产生严重的问题.

  1. 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);
});
  1. 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;
  1. 我在这里使用了快速车把,所以我导入了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' ]
}

推荐答案

正如您所说的,每当页面重新加载时,都会设置一个新的连接,您无法做任何事情来避免它 但是,您可以使用快速会话来存储用户的详细信息,即使在页面重新加载之后也是如此,并执行必要的判断以避免createASingleRoom被同一个人调用

可能会在客户端会话中创建单独的USERID变量,并维护对该变量的判断

用法

const session = require('express-session')

app.use(session({
secret: 'my-secret',
resave: false, 
saveUninitialized: false  
}))

app.get('/', (req, res)=>{
req.session.userID = someRandomNumber
})

然后继续判断该用户ID

Javascript相关问答推荐

Angular中计算信号和getter的区别

React 17与React 18中的不同setState行为

使用i18next在React中不重新加载翻译动态数据的问题

如何使用子字符串在数组中搜索重复项

变量的值在Reaction组件中的Try-Catch语句之外丢失

IF语句的计算结果与实际情况相反

如何在 Select 文本时停止Click事件?

try 使用PM2在AWS ubuntu服务器上运行 node 进程时出错

为什么我的按钮没有从&q;1更改为&q;X&q;?

Google脚本数组映射函数横向输出

expo 联系人:如果联系人的状态被拒绝,则请求访问联系人的权限

如何在和IF语句中使用||和&;&;?

为什么延迟在我的laravel项目中不起作用?

对具有相似属性的对象数组进行分组,并使用串连的值获得结果

输入的值的类型脚本array.排序()

将Auth0用户对象存储在nextjs类型脚本的Reaction上下文中

Promise.race()返回已解析的promise ,而不是第一个被拒绝的promise

在Puppeteer中使用promise进行日志(log)记录时出现TargetCloseError

如何在Reaction中设置缺省值, Select 下拉列表,动态追加剩余值?

Node.js的Fetch()调用总是创建新的Express会话