为什么客户端收不到 socket.io 广播(房间)?

Why is the client not receiving the socket.io broadcast (rooms)?

我的客户端收不到发送到房间的广播。如果我用 socket.emit('join', currentUser); 替换 socket.to(roomName).emit('join', currentUser); 客户端会收到广播,但我想在这里使用房间。任何帮助将不胜感激。

app.js

// Game
app.get('/game', (req, res) => {
    const cookies = req.cookies;
    const currentUser = cookies['current_user'];
    const roomName = cookies['room_name'];

    if (roomName) {
        res.render('pages/game', {
            room: roomName
        });

        io.of('/game').on('connection', socket => {
            console.log('a user connected');
            socket.on('disconnect', () => {
                console.log('user disconnected');
            });

            socket.join(roomName);

            socket.to(roomName).emit('join', currentUser);
        });
    } else {
        res.redirect('/login');
    }
});

game.ejs

const socket = io("/game");

socket.on('join', function(user) {
    console.log(`${user} joined`);
});

另外,我可以替换这个吗:

if (roomName) {
    // stuff
} else {
    // other stuff
}

有了这个:

if (!roomName) {
    // other stuff
    return;
}
// stuff

根据 documentation,如果您使用 socket.to('room').emit(...) 而不是 io.in('room').emit(...),它将被广播到房间中的所有插座 除了发送者 。这就是你的问题所在。

socket.emit(...) 起作用的原因是因为您直接发送它并且 给发件人。

这个 emit cheatsheet 对于找出 io/socketto 等的哪些组合影响消息发送到的位置非常有用。