[英]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.