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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:13:13