【问题标题】:SailsSocket Keep Trying to ReconnectSailsS​​ocket 不断尝试重新连接
【发布时间】:2017-03-30 14:01:49
【问题描述】:

在与 socket.io 连接身份验证(herehere)苦苦挣扎之后,感谢@sgress454,我意识到如何让它工作,我正在发送身份验证/授权令牌作为查询的一部分连接(见下文)。

在身份验证失败(无效/过期令牌或非活动用户)时,我返回带有 false 参数的回调以指示连接被拒绝。

但在客户端,我不确定我应该如何处理它,而且似乎即使在明确断开连接后套接字仍在尝试重新连接 - 我一直看到它正在尝试重新连接。

客户端代码是这样的:

var _onConnectError = function(err) {
    if (err.description == 400) {
        console.log("Connection rejected");
        _disconnectAndCleanupSocket();
    } else {
        console.log("##SOCKET - connect_error", err.description, err);
    }
}

var _disconnectAndCleanupSocket = function() {
    if (io.socket) {
        if (io.socket.isConnected()) {
            io.socket.disconnect();
        }

        io.socket.removeAllListeners();
        delete io.socket;
    }
};

io.socket = io.sails.connect({ query: "token=" + token});
io.socket.on('connect', _onConnect);
io.socket.on('connect_error', _onConnectError);
io.socket.on('reconnect_error', _onConnectError);

在服务器 (config/sockets.js) 我有:

beforeConnect: function(handshake, cb) {
    var token = handshake._query ? handshake._query.token : null;

    CipherService.verifyToken(token, function verifyTokenResults(err, decoded, info) {
        if (err || !decoded) {
            if (err.name === "TokenExpiredError") {
                // token expired - user can't connect...
                return cb(null, false);
            } else {
                // some other error...
                return cb(err, false);
            }
        }

        AuthUser.findOne(decoded.user.id).exec(function(err, user) {
            if (err || !user || !user.is_active) {
                return cb(null, false);
            }

            return cb(null, true);
        });
    });
    // (`false` would reject the connection)
},

我尝试查找文档并探索了响应对象(在开发人员工具中),但我看到的唯一内容是description 字段,它在拒绝时返回 400,在没有响应的情况下返回 0(例如服务器已关闭)。

是否有一些示例/文档?总的来说,我没有找到在非标准情况下使用SailsSocket 的详细说明(其他情况下使用io.sails.connect())。

处理这种拒绝的正确方法是什么(它不应该作为sails socket.io客户端的一部分处理它吗?)

顺便说一句,我不能自己实例化SailsSocket,只能使用“io.sails.connect()”函数来实现。这是故意的吗?当我使用 connect 方法创建套接字然后才分配事件处理程序时,是否没有“错过”事件的选项?

【问题讨论】:

    标签: javascript socket.io sails.js


    【解决方案1】:

    对您的问题的简短回答是,您可以设置 reconnection 标志来打开或关闭自动重新连接:

    // Disable auto-reconnect for all new socket connections
    io.sails.reconnection = false;
    
    // Disable auto-reconnect for a single new socket connection
    var mySocket = io.sails.connect({reconnection: false});
    

    SailsSocket 创建而言,您是正确的,io.sails.connect() 是创建 SailsS​​ocket 的唯一方法。由于连接是异步的,因此您在调用connect 后立即绑定的任何事件处理程序都将在实际连接发生之前添加,因此您不会错过任何通知。

    【讨论】:

    • 感谢您的回复!如果我理解正确,设置reconnection: false 无论如何都会阻止重新连接。鉴于我在移动应用程序上工作,预计会出现连接问题,并且需要我处理代码中的所有重新连接情况?有没有办法在某些情况下防止重新连接(就像我上面尝试的那样)?从逻辑上讲(嗯,对我来说 :) 在被拒绝后尝试重新连接是没有意义的,除非有什么改变……关于连接/处理程序 - 应该考虑一下 - 它是带有事件循环的异步 JS :-)
    • reconnection 目前是一个全有或全无的设置。如果您想处理随机断开连接,您可以捕获disconnect 事件并手动执行.reconnect() call
    • 这意味着默认情况下(例如自动连接)被拒绝的套接字会继续尝试重新连接吗?是不是有点浪费?我想对于网络来说它不太重要,但我认为 Sails 也用于移动应用程序......
    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2016-05-12
    相关资源
    最近更新 更多