未定义对象,NodeJ无法读取对象

时间:2018-11-10 06:24:35

标签: javascript arrays node.js

我试图通过遍历所有房间来读取房间的对象,然后最终读取房间中的用户对象。即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' } ] }

有人可以向我解释为什么会这样,并可能进行修复。我还将感谢您提供的任何提示。谢谢。

2 个答案:

答案 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,...)