我试图通过遍历所有房间来读取房间的对象,然后最终读取房间中的用户对象。即room.users
let removeUserFromRoom = (allRooms, socket) => {
console.log("All Rooms: ", allRooms);
for (let room in allRooms) {
//Find the user
console.log("Users to be removed is in: ", room.users);
let findUser = room.users.findIndex((element, index, array) => {
//Could also have been return element.socketID === socket.id ? true : false
if (element.socketID === socket.id) {
return true;
} else {
return false;
}
});
if (findUser > -1) {
socket.leave(room.roomID);
room.users.splice(findUser, 1);
return room;
}
}
第一个console.log打印以下内容
[ { room: 'G',
roomID: '8ca47c9e0ca6bcac2f8a432a1811fe77f201b444996b7d8d',
users: [ [Object], [Object] ] },
{ room: 'f',
roomID: 'b3fa2e1d862f881df299d0bf2f9f7ad01b85fbc270274efd',
users: [] } ]
但是第二读
undefined
原始错误如下
D:\Learn\NodeJs\All about Node Js\app\helpers\index.js:157
let findUser = room.users.findIndex((element, index, array) => {
^
TypeError: Cannot read property 'findIndex' of undefined
at Object.removeUserFromRoom (D:\Learn\NodeJs\All about Node Js\app\helpers\index.js:157:31)
at Socket.socket.on (D:\Learn\NodeJs\All about Node Js\app\socket\index.js:79:26)
at emitOne (events.js:116:13)
at Socket.emit (events.js:211:7)
at Socket.emit (D:\Learn\NodeJs\All about Node Js\node_modules\socket.io\lib\socket.js:142:10)
at Socket.onclose (D:\Learn\NodeJs\All about Node Js\node_modules\socket.io\lib\socket.js:454:8)
at Client.onclose (D:\Learn\NodeJs\All about Node Js\node_modules\socket.io\lib\client.js:254:24)
at emitTwo (events.js:131:20)
at Socket.emit (events.js:214:7)
at Socket.onClose (D:\Learn\NodeJs\All about Node Js\node_modules\engine.io\lib\socket.js:318:10)
at Socket.onError (D:\Learn\NodeJs\All about Node Js\node_modules\engine.io\lib\socket.js:127:8)
at Object.onceWrapper (events.js:315:30)
at emitOne (events.js:116:13)
at WebSocket.emit (events.js:211:7)
at WebSocket.Transport.onError (D:\Learn\NodeJs\All about Node Js\node_modules\engine.io\lib\transport.js:91:10)
at emitOne (events.js:116:13)
我不明白它是如何定义的,但我确定它里面有对象
[ { socketID: '/chatter#nQuCX5Oih-Ej7Zz8AAAC',
userID: '5be670ecccd47d314c8076d0',
user: 'IKE DJ',
userPic: 'https://lh5.googleusercontent.com/-_9lRYC_9nGs/AAAAAAAAAAI/AAAAAAAAANg/2YAtEfXiFiA/photo.jpg?sz=50' },
{ socketID: '/chatter#9tzwVPoBbr8RyfYLAAAD',
userID: '5be670d8ccd47d314c8076cf',
user: 'Ike Mawira',
userPic: 'https://lh3.googleusercontent.com/-XdUIqdMkCWA/AAAAAAAAAAI/AAAAAAAAAAA/4252rscbv5M/photo.jpg?sz=50' } ]
我特别感兴趣的房间是
{ room: 'G',
roomID: '8ca47c9e0ca6bcac2f8a432a1811fe77f201b444996b7d8d',
users:
[ { socketID: '/chatter#nQuCX5Oih-Ej7Zz8AAAC',
userID: '5be670ecccd47d314c8076d0',
user: 'IKE DJ',
userPic: 'https://lh5.googleusercontent.com/-_9lRYC_9nGs/AAAAAAAAAAI/AAAAAAAAANg/2YAtEfXiFiA/photo.jpg?sz=50' },
{ socketID: '/chatter#9tzwVPoBbr8RyfYLAAAD',
userID: '5be670d8ccd47d314c8076cf',
user: 'Ike Mawira',
userPic: 'https://lh3.googleusercontent.com/-XdUIqdMkCWA/AAAAAAAAAAI/AAAAAAAAAAA/4252rscbv5M/photo.jpg?sz=50' } ] }
有人可以向我解释为什么会这样,并可能进行修复。我还将感谢您提供的任何提示。谢谢。
答案 0 :(得分:0)
由于allRooms是一个数组,当您执行“ for ... in”操作时,您将获得索引,而不是元素...,因此您可以更改
来自
console.log("Users to be removed is in: ", room.users);
到
console.log("Users to be removed is in: ", allRooms[room].users);
或将“ for .. in”更改为“ for ... of”
for (let room in allRooms)
TO
for (let room of allRooms)
答案 1 :(得分:0)
您应使用:
let room of allRooms
代替:
let room in allRooms
第一个迭代数组的元素,第二个迭代它们的索引(0,1,2,...)