“命名空间<DefaultEventsMap, DefaultEventsMap, DefaultEventsMap, any>”类型上不存在属性“已连接”

问题描述 投票:0回答:1

当我尝试运行以下代码时:

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));
    for (let i = 0; i < users.length; i++) {
        let user = users[i];
        meeting_server.sockets.connected[user.socket_id].disconnect;
    }
}

它在代码的最后一行给我这个错误信息:

属性“已连接”在类型上不存在 '命名空间'.

似乎代码有点过时了,

socket.io
现在以另一种方式工作,但我不确定如何?我应该如何更新此代码?

node.js typescript sockets socket.io disconnect
1个回答
0
投票

最新版本的 Socket.IO 中的 Namespace 对象的 sockets 属性不再提供 connected 属性。相反,您可以使用 sockets.sockets 属性获取所有已连接套接字的映射,然后使用 get 方法通过其 ID 检索特定套接字。试试这个代码:

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));
for (let i = 0; i < users.length; i++) {
let user = users[i];
meeting_server.sockets.sockets.get(user.socket_id)?.disconnect();
}
}

您可以使用可选的链接运算符 (?.) 来处理映射中不存在具有指定 ID 的套接字的情况(例如,如果用户已经断开连接)。

© www.soinside.com 2019 - 2024. All rights reserved.