【问题标题】:Socket undefined, send don't send if undefined套接字未定义,如果未定义则发送不发送
【发布时间】:2018-12-29 19:39:26
【问题描述】:

您好,我编写了以下函数来获取某人的套接字;

var getSocket = function(persId){
    var socketid = users[persId].socket;
    if(io.sockets.connected[socketid]){
        return io.sockets.connected[socketid];
    }
}

它们是这样发射的;

getSocket(372).emit({ ... });

现在,如果用户在发送套接字之前断开连接,则会导致未定义的套接字错误,这可能会导致问题。

有没有办法通过修改函数(无需检查if getSocket(372))使其不抛出错误?它现在正在引起问题。

谢谢!

【问题讨论】:

    标签: javascript node.js error-handling socket.io


    【解决方案1】:

    你应该做的是使用 socket.io 函数,它已经检查过了。

    io.to(room).emit()

    在连接时,只需将用户加入一个名为 372 的房间(我相信那是用户 ID),然后发送给它:

    io.on('connection', socket => {
    
        const room = 372; // Get user id somehow
        socket.join(room);
    
    });
    
    // Somewhere
    io.to(372).emit(..)
    

    回答您的具体问题后,您可以使用 emit nop 方法返回一个对象。您还必须在访问.socket 之前检查用户是否存在。你可以使用解构来做到这一点。

    const { socket: socketId } = users[persId] || {};
    

    完整的功能应该是:

    const getSocket = function(persId){
        const { socket: socketId } = users[persId] || {};
        if(socketId && io.sockets.connected[socketId]){
            return io.sockets.connected[socketId];
        }
    
        return { emit: () => {} }
    }
    

    现在您不必执行检查,因为.emit 将永远存在。

    getSocket(23123213).emit(); // Will no throw if 23123213 doesn't exist
    

    【讨论】:

    • 是的,我之前尝试过,但是套接字最终到达了错误的客户端,并且我尝试了很多变体,一切都会失败到 io.sockets.emit 甚至无法正常工作的地步。因此,我现在按原样使用它。我的功能是;返回 io.to(persId);
    • 如果它发送到错误的客户端,那么您的代码中有一个错误,您将用户加入到错误的频道。
    • 它是 100% 发射到正确的房间,玩家在里面,我什至列出了房间,它说他们存在他们的 id,但是当我调用 getSocket 时有时它会工作,有时它不会,并且在项目上写了几千行代码,现在很难对系统做出巨大的改变。
    • 它确实抛出了,我用错误的 persId 设置了超时,同样的问题发生了;类型错误:无法读取未定义的属性“套接字”
    • 我认为这是我的代码中的错误,因为persId不在对象users中,因此会抛出错误。
    猜你喜欢
    • 2021-04-08
    • 2019-04-22
    • 2018-12-25
    • 2019-04-19
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多