방에들어가는 라우터에서요,
const { rooms } = io.of('/chat').adapter;
이것을 통해서, 인원수를 구하잖아요.
정확히 adpater 가 무엇이고 어떻게 동작하는지 모르겠어요
설명 좀 부탁드려요.
그리고,
제가 다른 종류 브라우저 말고도, 그냥 크롬창 여러개 띄어도 인원수가 오르더라구요.
그래서,
const { rooms } = io.of('/chat').adapter;
console.log(rooms)
console.log(rooms[req.params.id])
이런식으로 콘솔을 찍어 보았어요.
실험 1.
방을 한개 만들고, 새창 여러개로 같은 방 한개 들어가기
console.log(rooms) 결과값 :
{
'/chat#rC63n8xyVth_znN0AAAA': Room { sockets: { '/chat#rC63n8xyVth_znN0AAAA': true }, length: 1 },
'5d64e09b9b873811fc6be793': Room {
sockets: {
'/chat#rC63n8xyVth_znN0AAAA': true,
'/chat#Ion8Gy0D2IPHw2asAAAC': true,
'/chat#dW1lh61HDNDZgtUoAAAE': true,
'/chat#zyZAZfj99vt4o_qmAAAD': true,
'/chat#_zy1s7cDk6VzPKPwAAAF': true
},
length: 5
},
'/chat#h9tN1OVDzUCgOUVvAAAB': Room { sockets: { '/chat#h9tN1OVDzUCgOUVvAAAB': true }, length: 1 },
'5d64dd1a8d9e4c0d0fa953e7': Room { sockets: { '/chat#h9tN1OVDzUCgOUVvAAAB': true }, length: 1 },
'/chat#Ion8Gy0D2IPHw2asAAAC': Room { sockets: { '/chat#Ion8Gy0D2IPHw2asAAAC': true }, length: 1 },
'/chat#dW1lh61HDNDZgtUoAAAE': Room { sockets: { '/chat#dW1lh61HDNDZgtUoAAAE': true }, length: 1 },
'/chat#zyZAZfj99vt4o_qmAAAD': Room { sockets: { '/chat#zyZAZfj99vt4o_qmAAAD': true }, length: 1 },
'/chat#_zy1s7cDk6VzPKPwAAAF': Room { sockets: { '/chat#_zy1s7cDk6VzPKPwAAAF': true }, length: 1 }
}
console.log(rooms[req.params.id]) 결과값:
Room {
sockets: {
'/chat#rC63n8xyVth_znN0AAAA': true,
'/chat#Ion8Gy0D2IPHw2asAAAC': true,
'/chat#dW1lh61HDNDZgtUoAAAE': true,
'/chat#zyZAZfj99vt4o_qmAAAD': true,
'/chat#_zy1s7cDk6VzPKPwAAAF': true
},
length: 5
}
이렇게 나오면, 소켓 5 개가 사용됬다는걸 알 수 있던데요.
실험 2
방 A 를 만든다( 만들면 자동으로 들어가짐)
A 의 req.params.id 는 '5d64f4aab36b762d2becb422'
console.log(rooms) 결과값 :
console.log(rooms[req.params.id]) 결과값:
새창을 하나 열어서, 방 A 로 들어간다.
console.log(rooms) 결과값 :
{
'/chat#Dqd1TiXLKQZHEsjKAAAC': Room { sockets: { '/chat#Dqd1TiXLKQZHEsjKAAAC': true }, length: 1 },
'5d64f4aab36b762d2becb422': Room { sockets: { '/chat#Dqd1TiXLKQZHEsjKAAAC': true }, length: 1 }
}
console.log(rooms[req.params.id]) 결과값:
Room { sockets: { '/chat#Dqd1TiXLKQZHEsjKAAAC': true },
length: 1 }이 나옵니다.
새창을 또 하나 열어서, 방 A 로 들어간다.
console.log(rooms) 결과값 :
{
'/chat#B7ZV-1fDOnIVJzCzAAAA': Room { sockets: { '/chat#B7ZV-1fDOnIVJzCzAAAA': true }, length: 1 },
'5d64f4aab36b762d2becb422': Room {
sockets: {
'/chat#B7ZV-1fDOnIVJzCzAAAA': true,
'/chat#bQybDCrRdzFs_AnsAAAB': true
},
length: 2
},
'/chat#bQybDCrRdzFs_AnsAAAB': Room { sockets: { '/chat#bQybDCrRdzFs_AnsAAAB': true }, length: 1 }
}
console.log(rooms[req.params.id]) 결과값:
Room {
sockets: {
'/chat#B7ZV-1fDOnIVJzCzAAAA': true,
'/chat#bQybDCrRdzFs_AnsAAAB': true
},
length: 2
}
지금 여기서 보면, 실질적으로 방 A에는 3 명의 인원이 들어가있는데 lenght 는 2로 나옵니다.
그런데 특이하게
방 B를 만들면, 방 A에 3 명이(옳은 인원수) 들어가 있다고 업데이트가 됩니다.
B 의 req.params.id 는 '5d64ecdedcd19c1e1979ad8b'
console.log(rooms) 결과값 :
{
'/chat#B7ZV-1fDOnIVJzCzAAAA': Room { sockets: { '/chat#B7ZV-1fDOnIVJzCzAAAA': true }, length: 1 },
'5d64f4aab36b762d2becb422': Room {
sockets: {
'/chat#B7ZV-1fDOnIVJzCzAAAA': true,
'/chat#bQybDCrRdzFs_AnsAAAB': true,
'/chat#P4zrqxRE0Sv_sJySAAAD': true
},
length: 3
},
'/chat#bQybDCrRdzFs_AnsAAAB': Room { sockets: { '/chat#bQybDCrRdzFs_AnsAAAB': true }, length: 1 },
'/chat#P4zrqxRE0Sv_sJySAAAD': Room { sockets: { '/chat#P4zrqxRE0Sv_sJySAAAD': true }, length: 1 }
}
console.log(rooms[req.params.id]) 결과값:
undefined
하지만, 방 B에는 인원이 1 명이 들어 있음에도 불가하고 ,
방 B의 정보는 찍히지가 않습니다.
그리고 방 B에 새창으로 들어가면, 방 B에 1 이 뜹니다.
마찬가지로, 방 A 새창으로 들어가면,
방 B에는 2명이라고 뜨고,
방 A에는 4명이 떠야하는데 3명이라 뜹니다.
이와 같이, 방에들어가면 바로 업뎃이 안되는데 이유좀 알 수있을까요???
이유 인즉슨, 5d64ecdedcd19c1e1979ad8b B의 req.params.id 값이 없고, A의 값에 소켓들이 추가 되더라구요 length 1에서 2 를 보실수 있듯이요.
제가 정확히
const { rooms } = io.of('/chat').adapter;
이게 어떤식으로 정보를 저장하는지 몰라서 그러는거같은데
설명좀 부탁드려요 .