Node.js NodeJS socket.io室和;广播问题

Node.js NodeJS socket.io室和;广播问题,node.js,socket.io,Node.js,Socket.io,我不知道这是一个bug还是我做错了什么,但如果我广播了多条消息,只有第一条消息会广播到正确的房间,其他所有消息都会广播到连接到socket.io的所有人 socket.on('clientMessage', function(content){ socket.emit('serverMessage', {name : 'You said', data : content} ); socket.get('username', function(err, username){

我不知道这是一个bug还是我做错了什么,但如果我广播了多条消息,只有第一条消息会广播到正确的房间,其他所有消息都会广播到连接到socket.io的所有人

socket.on('clientMessage', function(content){
    socket.emit('serverMessage', {name : 'You said', data : content} );
    socket.get('username', function(err, username){
        if (err) { throw err; }         
        if(! username){
            username = socket.id;       
        }
        socket.get('room', function(err, room){
            if (err) { throw err; }
            if(room) {
                socket.broadcast.to(room);          
            }
            socket.broadcast.emit('serverMessage', {name: username, data : content} );
            socket.broadcast.emit('serverMessage', 'test' );

        });
    });
});
我的问题在于以下几行:

socket.broadcast.emit('serverMessage', {name: username, data : content} );
socket.broadcast.emit('serverMessage', 'test' );
使用两个socket.broadcast.emit,第二个将广播给所有人


这是怎么回事?

您做出了错误的(尽管可以理解)假设,
socket.broadcast.to(room)
对套接字连接的内部状态进行了持久的更改,以便对指定的room进行任何后续广播。实际上,在重置之前,它只会持续一次
emit
to
方法旨在链接到每个
emit
调用,如下所示:

        socket.broadcast.to(room).emit('serverMessage', {name: username, data : content});          
        socket.broadcast.to(room).emit('serverMessage', 'test' );
默认情况下,每个套接字都连接到一个名称为空的文件室,因此,如果您打算广播到某个特定的文件室(如果存在),或者广播到所有人,那么您的代码可以简单地重写为:

    socket.get('room', function(err, room){
        if (err) { throw err; }
        // Default to the global room
        room = room || '';
        socket.broadcast.to(room).emit('serverMessage', {name: username, data : content} );            
        socket.broadcast.to(room).emit('serverMessage', 'test' );
    });

泰,我想可能是这样的。谢谢