【问题标题】:Socket.io doesn't remove user object from array after disconnect断开连接后,Socket.io 不会从数组中删除用户对象
【发布时间】:2020-07-30 16:01:45
【问题描述】:
const socketUsers = [];

io.on("connection", (socket) => {
    socket.on("user", (userdata) => {
        const aUser = { socket: socket, user: userdata };
        socketUsers.push(aUser);
    });

    socket.on("disconnect", () => {
        delete socketUsers[socket.id];
        console.log(socketUsers);
    });
});

socketuser 字段也被分配给 aUser 然后它被推入 socketUsers 数组。这发生在用户登录后,因为我们需要他们的用户数据。

当用户断开连接时,控制台会为我记录数组,但用户仍然存在(socket 和 userdata 字段)。

我做错了什么?

【问题讨论】:

    标签: javascript node.js sockets socket.io


    【解决方案1】:

    您错误地索引了数组,将新套接字推到它上面不会使这些套接字的 id 成为数组的索引,据我所知,您可能应该改用对象。

    const socketUsers = {};
    
    io.on("connection", (socket) => {
        socket.on("user", (userdata) => {
            const aUser = { socket: socket, user: userdata };
            socketUsers[socket.id] = aUser;
        });
    
        socket.on("disconnect", () => {
            delete socketUsers[socket.id];
            console.log(socketUsers);
        });
    });
    

    如果您如此坚持使用数组,则必须手动搜索它以查找您要查找的元素的索引

    const socketUsers = [];
    
    io.on("connection", (socket) => {
        socket.on("user", (userdata) => {
            const aUser = { socket: socket, user: userdata };
            socketUsers.push(aUser);
        });
    
        socket.on("disconnect", () => {
            socketUsers.splice(socketUsers.findIndex(elem => elem.socket.id === socket.id), 1);
            console.log(socketUsers);
        });
    });
    

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 2017-07-17
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      相关资源
      最近更新 更多