在我的代码中,我试图创建房间,但我不知道为什么每次使用新房间创建旧房间时

时间:2018-07-03 07:20:46

标签: javascript node.js socket.io

这是我的server.js文件。在这个过程中,我每次创建一个新房间 房间请求,然后将创建的房间推入rooms数组。 用户名和房间名是通过post request.Form来获取的,但是我不知道为什么每次使用新的套接字ID都会创建所有以前的房间 喜欢。如果我第一次给它提供一个用户名:abc和roomname:room1,它将创建一个房间,然后如果我下次使用新的套接字连接创建一个房间用户名:abc2和roomname:room2,那么它将再次创建旧房间(用户名:abc,房间名称:room1),然后增加房间阵列的长度,然后创建新房间(用户名:abc2,房间名称:room2),并增加房间阵列的长度。

//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');
});

1 个答案:

答案 0 :(得分:0)

重复添加的原因

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

删除不必要行为的建议

将您的房间创建置于socket.io connection事件处理程序之外,并将connection处理程序注册置于HTTP post处理程序之外。

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');
});