SailsS​​ocket继续尝试重新连接

时间:2017-03-30 14:01:50

标签: javascript socket.io sails.js

在努力使用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方法创建套接字并且只分配事件处理程序时,是否没有“错过”事件的选项?

1 个答案:

答案 0 :(得分:0)

您的问题的简短回答是您可以设置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后立即绑定任何事件处理程序,因此您不会错过任何通知。