Node.js与socket.io报错:Cannot read properties of undefined (reading 'includes')
解决TypeError: Cannot read properties of undefined (reading 'includes')问题
这个报错的核心原因是socket.roomsJoined的值为undefined,你试图调用它的includes方法,自然会抛出类型错误。以下是具体的排查和修复方案:
1. 确保socket.roomsJoined被正确初始化
在Socket.io的连接回调中,必须给socket.roomsJoined初始化为空数组,保证它从一开始就是数组类型:
io.on('connection', (socket) => { // 初始化用户房间数组 socket.roomsJoined = []; // 后续的房间加入、业务逻辑... });
2. 检查房间操作的代码逻辑
确认用户加入/离开房间时,确实在修改socket.roomsJoined数组:
- 加入房间时的示例代码:
socket.on('joinRoom', (roomId) => { // 避免重复添加同一房间ID if (!socket.roomsJoined.includes(roomId)) { socket.roomsJoined.push(roomId); } // 其他房间相关操作(比如socket.join(roomId)) });
- 离开房间时的示例代码:
socket.on('leaveRoom', (roomId) => { // 从数组中移除对应的房间ID socket.roomsJoined = socket.roomsJoined.filter(id => id !== roomId); // 其他离开操作(比如socket.leave(roomId)) });
3. 增加防御性检查避免意外报错
即使做了初始化,也可能存在异常情况导致socket.roomsJoined丢失或类型异常,在使用前增加判断:
for (let key of Object.keys(rooms)){ console.log("ru "+socket.roomsJoined); // 先验证是否为有效数组,再调用includes if (Array.isArray(socket.roomsJoined) && socket.roomsJoined.includes(key)){ userdata.push([rooms[key][0],[rooms[key][2]]]); } }
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

