呼び出すことなく、ソケットが現在ある部屋を取得することは可能ですか?
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', ...]
バージョン1.7.3、socket.rooms
にはsocket.id
が含まれているため、これを削除して部屋のリストを取得します。
Object.keys(socket.rooms).filter(item => item!=socket.id);
他のバージョンでは、socket
を印刷して部屋を見つけることができます。
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つの部屋だけにあることを確認して、私の解決策は次のとおりでした:
var currentRoom = Object.keys(io.sockets.adapter.sids[socket.id]).filter(item => item!=socket.id);
バージョン2.0.3
io.sockets.sockets[yourSocketID].rooms
それと等しい
socket.rooms
Socket.io v2.1.1
ですから、私がそうであったように、disconnect
イベントのソケットルームにアクセスしていないことを確認してください。ソケットルームは、イベントがトリガーされる時点ですでにルームを離れているためです。やりたい場合は、disconnecting
イベントで試してください- https://github.com/socketio/socket.io/pull/2332/files
その後、次のいずれかを使用できます。
Object.keys(socket.adapter.rooms)
Object.keys(socket.adapter.sids)
Object.keys(socket.rooms)
部屋に参加するときに、ソケット自体に部屋を保存できます
// join room
socket.join(room);
// update socket's rooms
if (socket.rooms) {
socket.rooms.Push(room);
} else {
socket.rooms = [room];
}
後で、ソケットが入っているすべての部屋を簡単に取得できます
socket.rooms
サーバーAPIドキュメントから:
socket.rooms(オブジェクト)
このクライアントがいる部屋を識別する文字列のハッシュであり、部屋名でインデックスが付けられています。
socket.io 1.7.3 +
var currentRoom = socket.rooms[Object.keys(socket.rooms)[0]];//returns name of room