在我的代码中,我正在尝试创建房间,但我不知道为什么每次它都用新房间创建旧房间



这是我的服务器.js文件。在此,我在每次创建时都会创建一个新房间 房间请求,然后将创建的房间推送到房间数组中。 用户名和房间名称通过邮寄请求从表格中获取。但我不知道为什么它每次都使用新的套接字 ID 创建所有以前的房间 喜欢。如果我第一次给它一个用户名:abc 和房间名称:room1,它将创建一个房间,那么下次如果我创建一个房间用户名:abc2 和房间名称:房间 2 在那时使用新的套接字连接,它将再次创建旧房间(用户名:abc,房间名称:房间 1( 首先并增加房间数组长度,然后创建新房间(用户名:abc2,房间名称:房间2(并增加房间数组的长度。

//server.js

const express = require('express');
const app = new express();
const socket = require('socket.io');
const bodyParser = require('body-parser');
const port = process.env.PORT || 8000;
const server = app.listen(port,() =>{
console.log(`server is running on the port number ${port}`);
})

const io = socket(server);

app.use(express.static(`${__dirname}/public`));
app.set('view engine','ejs');
app.set('views',`${__dirname}/views`);
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());
let rooms = [];
function pushRoom(rooms,usernme,roomname){
let room = {
name:roomname,
users:[]
}
room.users.push(usernme);
rooms.push(room);
} 
function joinRoom(rooms,roomjoinname,username){
for(let i=0 ; i<rooms.length ; i++){
if(rooms[i].name == roomjoinname){
rooms[i].users.push(username);
}
}
}
app.get('/',(req,res,next) =>{
res.render('index');
})
//taking values from user by post request
app.post('/chat',(req,res,next) =>{
io.on('connection',socket =>{
console.log('made a socket connection'+socket.id);
let roomName = req.body.roomName;
let userName = req.body.username;
let roomNameJoin = req.body.roomNameJoin;
pushRoom(rooms,userName,roomName);
socket.join('roomName');
});
res.render('chat');
});

重复添加的原因

这是因为每次用户访问/chat页面时,您都会向 socket.io 服务器添加新的侦听器。因此,如果 3 个用户访问了/chat页面,则将为connection事件注册 3 个事件侦听器。这意味着,当此时进行新connection时,将执行 3 个注册侦听器,并将三个新房间推送到您的阵列。

删除不需要的行为的建议

将聊天室创建放在 socket.ioconnection事件处理程序之外,并将connection处理程序注册放在 HTTPpost处理程序之外。

app.post('/chat', (req,res,next) => {
let roomName = req.body.roomName;
let userName = req.body.username;
pushRoom(rooms,userName,roomName);
res.render('chat');
});
io.on('connection', socket => {
console.log('made a socket connection'+socket.id);
socket.join('roomName');
});

最新更新