Socket.io: socket.rooms - бСсполСзный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 8 ΠΌΠ°Ρ€. 2017  Β·  8ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: socketio/socket.io

Π­Ρ‚ΠΎ касаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° socket.rooms , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ ΠΊΠ°ΠΊ:

Π₯эш строк, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… находится этот ΠΊΠ»ΠΈΠ΅Π½Ρ‚, индСксированный ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹.

НС знаю, Ρ‡Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚, Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ясСн:

io.on('connection', function(socket){
  socket.join('room 237', function(){
    console.log(socket.rooms); // [ <socket.id>, 'room 237' ]
    io.to('room 237', 'a new user has joined the room'); // broadcast to everyone in the room
  });
});

Когда я Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽ console.log(socket.rooms); , я _ Ρ…ΠΎΡ‡Ρƒ_ этот красивый массив (Ρ‡Ρ‚ΠΎΠ±Ρ‹ я ΠΌΠΎΠ³ ΠΎΡ‚Ρ€Π΅Π·Π°Ρ‚ΡŒΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹), Π½ΠΎ я ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ этот ΡƒΡ€ΠΎΠ΄Π»ΠΈΠ²Ρ‹ΠΉ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ:

io.on('connection', function(socket){
  socket.join('room 237', function(){
    console.log(socket.rooms); // { <socket.id>: '<socket.id>', 'room 237': 'room 237' }
  });
});

... ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π² массив с .keys() Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ socket.id (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ).

Π­Ρ‚ΠΎ ошибка? ΠŸΠΎΠ»ΡŒΠ·ΡƒΡŽΡΡŒ 1.7.3.

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π”Π°, это каТСтся излишнС слоТным. Π― Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΠΎ всСх сил ΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ сокСта ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ прСдставляСт собой Β«ΠΊΠΎΠΌΠ½Π°Ρ‚ΡƒΒ»? Или Π·Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ . Π­Ρ‚ΠΎ просто Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ список - ΠΊΠ°ΠΊΠΈΠ΅ Π±Ρ‹ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹ Π½ΠΈ присутствовали, Π²Ρ‹ Π² Π½ΠΈΡ… Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ.

['room1', 'room2', 'room3']

И, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅, io.rooms, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… всС Π»ΠΈΠ±ΠΎ Π² Π²ΠΈΠ΄Π΅ массива строк, Π»ΠΈΠ±ΠΎ, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΊΠΎΠΌΠ½Π°Ρ‚ Π² качСствС ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ массивом ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² сокСтов Π² качСствС ΠΈΡ… значСния.

{ room1: ['id1', 'id2', 'id3'], room2: ['id4', 'id5', 'id6'] }

ВсС 8 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π§Ρ‚ΠΎ ΠΆ, ΠΏΠΎΡ…ΠΎΠΆΠ΅, докумСнтация здСсь Π½Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π°, rooms самом Π΄Π΅Π»Π΅ Π±Ρ‹Π» массивом Π΄ΠΎ вСрсии 1.4, я Π΄ΡƒΠΌΠ°ΡŽ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: я Π΄ΡƒΠΌΠ°ΡŽ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² качСствС значСния.

Π”ΡƒΠΌΠ°ΡŽ, это запрос Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ socket.io снова ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ: Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ массивы!

Моя Ρ†Π΅Π»ΡŒ здСсь - ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ массив ΠΊΠΎΠΌΠ½Π°Ρ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… находится ΠΊΠ»ΠΈΠ΅Π½Ρ‚. Π‘ массивом я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽ, Ρ‡Ρ‚ΠΎ socket.id Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ:

var rooms = socket.rooms.slice(1);

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ:

var roomKeys = Object.keys(socket.rooms);
var socketIdIndex = roomKeys.indexOf( socket.id );
var rooms = roomKeys.splice( socketIdIndex, 1 );

Если Π±Ρ‹ socket.id Π½Π΅ Π±Ρ‹Π»ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ, Ρ‚ΠΎΠΆΠ΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ. Π― просто Π½Π΅ Ρ…ΠΎΡ‡Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ.

var rooms = Object.keys(socket.rooms);

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ логичСских Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ я ΠΌΠΎΠ³ Π±Ρ‹ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ истинныС значСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (Π²Π΅Ρ€Π½ΠΎ?):

var roomKeys = Object.keys(socket.rooms);
var rooms = roomKeys.filter(function(key){ 
  return socket.rooms[key]==true;
});

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΊΠ°ΠΊ итСрация с indexOf() .

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹ Ρ‡Π°Ρ‚Π°, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ). Π― просто Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ эта информация Π±Ρ‹Π»Π° Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΅Ρ‰Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² экзСмплярС Server :

var allRooms = io.rooms;
var myRooms = socket.rooms;

Π£ ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ ΠΌΠ½Π΅Π½ΠΈΠ΅ ΠΏΠΎ этому ΠΏΠΎΠ²ΠΎΠ΄Ρƒ?

Π”Π°, это каТСтся излишнС слоТным. Π― Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΠΎ всСх сил ΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ сокСта ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ прСдставляСт собой Β«ΠΊΠΎΠΌΠ½Π°Ρ‚ΡƒΒ»? Или Π·Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ . Π­Ρ‚ΠΎ просто Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ список - ΠΊΠ°ΠΊΠΈΠ΅ Π±Ρ‹ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹ Π½ΠΈ присутствовали, Π²Ρ‹ Π² Π½ΠΈΡ… Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ.

['room1', 'room2', 'room3']

И, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅, io.rooms, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… всС Π»ΠΈΠ±ΠΎ Π² Π²ΠΈΠ΄Π΅ массива строк, Π»ΠΈΠ±ΠΎ, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΊΠΎΠΌΠ½Π°Ρ‚ Π² качСствС ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ массивом ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² сокСтов Π² качСствС ΠΈΡ… значСния.

{ room1: ['id1', 'id2', 'id3'], room2: ['id4', 'id5', 'id6'] }

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ основная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° - это ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ поиска.
НапримСр, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ присоСдинился ΠΊ ΠΊΠΎΠΌΠ½Π°Ρ‚Π΅ 100, Π±Ρ‹Π»ΠΎ Π±Ρ‹ быстрСС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ поиск ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, присоСдинился Π»ΠΈ ΠΎΠ½ ΠΊ ΠΊΠΎΠΌΠ½Π°Ρ‚Π΅, Π° Π½Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ массива.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ ΠΌΠΎΠ΅ΠΌΡƒ ΠΎΡ‚Π²Π΅Ρ‚Ρƒ Π½Π° stackoverflow

{
    "room1":"room1",
    "room2":"room2",
    ...
    "room100":"room100"
}

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, присоСдинился Π»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΊ ΠΊΠΎΠΌΠ½Π°Ρ‚Π΅, достаточно просто:
if(socket.rooms[roomID]) return true;

Если это Ρ‚ΠΈΠΏ массива, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ indexOf ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ массив:
if(socket.rooms.indexOf(roomID) != -1) return true;

Но я ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ согласСн, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π½Π° логичСскоС:
{ room1: true, ... , room100: true }

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ памяти

Π― Π±Ρ‹ Π½Π΅ ΠΏΡ€ΠΎΡ‡ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ socket.rooms Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ значСния Π±Ρ‹Π»ΠΈ логичСскими. МоТно Π»ΠΈ Π½Π°Π΄ этим Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ? Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ это Π·Π° процСсс, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ я Π½Π΅ Π²ΠΈΠ΄Π΅Π» Ρ„Π°ΠΉΠ»Π° CONTRIBUTING.md.

Π Π°Π·Π²Π΅ Set ΠΈΠΌΠ΅Π΅Ρ‚ большС смысла?

if (socket.rooms.has(roomID)) return true;

НапримСр, структура Π±ΡƒΠ΄Π΅Ρ‚ просто Set(4)Β {"<socket ID>", "room1", "room2", "room3"}

Π― согласСн, Ссли врСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°Π±ΠΎΡ€Π° постоянна. Π― Π²Π΅Ρ€ΡŽ Π² javascript.

Π’ Socket.IO v3 Socket#rooms Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Set ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, прСдоставлСнноС Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ΠΎΠΌ, см. Π—Π΄Π΅ΡΡŒ .

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ