Возможно ли получить номера, в которые в данный момент находится сокет, не вызывая
io.sockets.clients(roomName)
для названия каждой комнаты и поиска этого сокета в результатах
Возможно ли получить номера, в которые в данный момент находится сокет, не вызывая
io.sockets.clients(roomName)
для названия каждой комнаты и поиска этого сокета в результатах
io.sockets.manager.roomClients[socket.id]
В версии socket.io версии 1+ синтаксис:
socket.rooms
socket.io 1.7.3 + →
Object.keys( io.sockets.adapter.sids[socket.id] )
// returns [socket.id, room-x'] || [socket.id, 'room-1', 'room-2', ...]
При использовании адаптера, отличного от стандартного, например socket.io-redis, socket.rooms
, похоже, не делает этого. То, как мне удалось получить номера для конкретного клиента без цикла, было использовать io.sockets.adapter.sids[socket.id]
, который возвращает комнаты как объект.
{ 'R-ZRgSf7h4wfPatcAAAC': true, ROOM: true, ROOM_2: true }
Обратите внимание, что это не список сокетов для других процессов, хотя!
socket.io v1.3.7, socket.io-redis 1.0.0
Версия 1.7.3, socket.rooms
содержит socket.id
, поэтому удалите ее и получите список комнат:
Object.keys(socket.rooms).filter(item => item!=socket.id);
В другой версии вы можете распечатать socket
и найти номера.
socket.io 1.7.3 +
var currentRoom = socket.rooms[Object.keys(socket.rooms)[0]];//returns name of room
Версия 2.0.3
io.sockets.sockets[yourSocketID].rooms
То, что совпадает с
socket.rooms
Вы можете сохранить комнату в самом гнезде, когда она присоединяется к комнате
// join room
socket.join(room);
// update socket rooms
if (socket.rooms) {
socket.rooms.push(room);
} else {
socket.rooms = [room];
}
Позже вы можете получить все номера, в которые есть сокет, просто
socket.rooms
Убедитесь, что сокет находится только в одной комнате за раз, мое решение было:
var currentRoom = Object.keys(io.sockets.adapter.sids[socket.id]).filter(item => item!=socket.id);
1.4.5 version = > io.sockets.adapter.rooms[roomname].sockets