You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:30:04