Javascript Socket.io连接连接到错误的房间

Javascript Socket.io连接连接到错误的房间,javascript,node.js,express,websocket,socket.io,Javascript,Node.js,Express,Websocket,Socket.io,当向localhost:3000/:id发出请求时,我想创建一个房间并将客户端添加到其中。然后,我希望该客户机所采取的操作只向该房间中的其他客户机广播。以下是处理该问题的服务器端代码: app.get('/:id', function response(req, res) { io.on('connection', function (socket) { socket.join('/game-' + req.params.id); so

当向
localhost:3000/:id
发出请求时,我想创建一个房间并将客户端添加到其中。然后,我希望该客户机所采取的操作只向该房间中的其他客户机广播。以下是处理该问题的服务器端代码:

app.get('/:id', function response(req, res) {
    io.on('connection', function (socket) {

            socket.join('/game-' + req.params.id);

            socket.on('action', function (action) {
                switch (action.type) {
                    case 'TOGGLE_ACTIVE_PLAYER':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', toggleActivePlayer())
                    case 'SET_SLOT_PREVIEW':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', setSlotPreview(action.colIndex))
                    case 'CLEAR_SLOT_PREVIEW':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', clearSlotPreview(action.colIndex))
                    case 'PLAYER_MOVED':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', playerMoved(action.colIndex))
                    case 'CHECK_FOR_WINNER':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', checkForWinner())
                    case 'CLEAR_BOARD':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', clearBoard())
                    case 'CLEAR_WINNER':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', clearWinner())
                    case 'RESET_GAME':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', resetGame())
                }
            })
    });
    res.end();
});
我遇到的问题是,当使用新的id参数(localhost:300/newIdParam)建立连接时,会创建一个名为newIdParam的文件室,并将该客户端添加到其中,但该客户端也会不适当地添加到现有文件室中。通过检查
io.sockets.adapter.rooms
对象,我可以判断客户机在两个房间中:

  '/game-123': 
   Room {
     sockets: 
      { '/#KIq0i-_oaf_mtM8AAAAK': true,
        '/#Sokr_2ROg0culZ6bAAAL': true,
        '/#w6XRgbfF3Q2TIicXAAAM': true },
     length: 3 },
  '/#Sokr_2ROg0culZ6bAAAL': Room { sockets: { '/#Sokr_2ROg0culZ6bAAAL': true }, length: 1 },
  '/#w6XRgbfF3Q2TIicXAAAM': Room { sockets: { '/#w6XRgbfF3Q2TIicXAAAM': true }, length: 1 },
  '/game-456': Room { sockets: { '/#w6XRgbfF3Q2TIicXAAAM': true }, length: 1 } }
请注意,两个房间中都有插座id
6xrgbff3q2tiicxaaam
。同样,这些房间的创建只需向发出请求,并将id作为路由参数,如下所示:

localhost:3000/123

该请求将创建一个名为game-123的房间,并自动添加请求的客户端


提前感谢您的建议。

这里,如果您需要类似于如果用户连接到新房间,那么用户不应该在旧房间中,因此只有一个房间与用户连接,那么您必须强制用户在断开连接时离开房间,如下所示

socket.on('disconnect', function(){
    socket.leave("roomname");
});

作为旁注,您为什么不将
操作作为事件名称发出呢?这会稍微打乱您的逻辑,您不需要切换案例块。客户端应用程序正在向服务器发送redux操作,因此这只是一个服务器端缩减器,redux缩减器到用户切换语句非常常见。这是我决定使用switch语句的唯一原因。好吧,这是有道理的。我个人一直认为redux的编写方式是一种JavaScript反模式,但我想这会引起更多的关注。