[英]Socket.io won't emit to a room
我正在尝试创建一个聊天大厅,用户可以在其中创建私人房间,其他人可以通过 uuid 加入。 This is built with node.js and socket.io, and it seems as if io.to(room).emit('event', 'data')
and io.sockets.to(room).emit('event', 'data')
不工作,而io.emit('event', 'data')
工作。 我的代码可以在下面找到:
io.sockets.on('connection', (socket) => {
socket.on('createRoom', function(data) {
let room = new Room(data).create();
let id = room.data.uuid
socket.join(id)
io.to(id).emit('roomcreated', {data: data, msg: 'Room Created'}) //Does not work!
io.emit('roomcreated', {data: data, msg: 'Room Created'}) //This Works
});
});
.join()
的一个常见问题是它实际上是异步的。 它不会立即完成。 这可能是因为它被设计用于支持集群的多进程、基于 redis 的适配器,并且连接进程必须是异步的,因为它正在与其他进程通信。
您可以通过向.join()
发送回调来解决您的问题,并且仅在房间完成加入后才发送到房间。
io.sockets.on('connection', (socket) => {
socket.on('createRoom', function(data) {
let room = new Room(data).create();
let id = room.data.uuid
socket.join(id, (err) => {
if (err) {
// do something here if the join fails
console.log(err);
return;
}
// call this only after the join has completed
io.to(id).emit('roomcreated', {data: data, msg: 'Room Created'});
});
});
});
我不完全确定io.in(id).emit('roomCreated', {d: data});
但我找到了一种解决方法。
我创建了一个名为 SOCKET_LIST 的所有 sockets 的 object,并为每个房间创建了一个包含该套接字 id 的数组:
var SOCKET_LIST = {};
io.sockets.on('connection', (socket) => {
socket.id = Math.random();
SOCKET_LIST[socket.id] = socket;
socket.on('createRoom', function(data) {
let room = new Room(data).create();
room.data.users.push(socket.id)
let id = room.data.uuid
socket.join(id, (err) => {
if(err) {
return console.log(err);
}
room.data.users.forEach(i => {
SOCKET_LIST[i].emit('roomcreated', {data: data, msg: 'Room Created'})
})
})
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.