Socket.io报错:Property 'connected'不存在于Namespace类型,如何更新代码?
解决方案
Socket.io v3及以上版本已移除connected属性,API结构也有调整,你需要修改代码中获取并断开socket的逻辑:
修改后的完整代码:
const endMeeting = async (meeting_id: string, socket: Socket, meeting_server: Server, payload: any) => { const { user_id } = payload.data; broadcastUsers(meeting_id, socket, meeting_server, { type: MeetingPayloadEnum.MEETING_ENDED, data: { user_id } }); let users: IUser[] = await Meetings.getAllMeetingUsers(toBinaryUUID(meeting_id)); // 获取默认命名空间下所有已连接的socket(Map结构) const connectedSockets = meeting_server.sockets.sockets; for (const user of users) { // 通过socket ID查找对应的socket实例 const targetSocket = connectedSockets.get(user.socket_id); if (targetSocket) { // 调用disconnect方法强制断开连接 targetSocket.disconnect(true); } } }
关键修改点:
- 移除
connected属性依赖:用meeting_server.sockets.sockets(一个Map<string, Socket>)替代旧的connected对象,通过get(socket_id)获取指定socket。 - 正确调用断开方法:原代码仅引用了
disconnect方法,需改为disconnect(true)执行断开操作,参数true表示强制断开,不等待客户端确认。 - 优化循环写法:用
for...of循环替代传统for循环,代码更简洁易读。
若使用自定义命名空间
如果你的会议使用了Socket.io自定义命名空间(比如/meetings),需要先获取对应命名空间再操作:
// 替换成你的自定义命名空间路径 const meetingNamespace = meeting_server.of('/meetings'); const connectedSockets = meetingNamespace.sockets; for (const user of users) { const targetSocket = connectedSockets.get(user.socket_id); if (targetSocket) { targetSocket.disconnect(true); } }
内容的提问来源于stack exchange,提问作者best_of_man
相关产品推荐
相关产品推荐

