Клиент аутентификации Angular 6 после перезапуска сервера socket.io socketio-jwt - PullRequest
0 голосов
/ 02 ноября 2018

Я хотел бы авторизовать событие eacht socket.io на стороне сервера. Когда я сначала открываю угловую страницу, вызываю метод initSocket(login: Login), все в порядке. Аутентификация прошла успешно, и я могу отправить сообщение на сервер. Но если я перезагружаю сервер, угловое переподключение к серверу по Httpp, но не могу отправить сообщение по socketio. На моем сервере нет сообщений в логах. Похоже, что socketio-jwt блокирует клиентское сообщение. Если я нажму F5 на стороне клиента, он все еще в порядке снова. Как решить это без обновления страницы? Кажется, мне нужно передать токен каждому событию на стороне клиента после установления соединения, но я не знаю, как это сделать.

Угловой 6:

    public initSocket(login: Login): void {
    this.socket = socketIo(SERVER_URL);
    console.log('Socket init at' + SERVER_URL);
    this.socket.emit('authenticate', { token: this.login.token });
    this.socket.on('authenticated', function () {
        console.log('socket is jwt authenticated');
    });
    this.socket.on('unauthorized', function (error, callback) {
        if (error.data.type === 'UnauthorizedError' || error.data.code === 'invalid_token') {
            // redirect user to login page perhaps or execute callback:
            callback();
            console.error('Users token has expired');
        }
    });

    this.socket.on('disconnect', function (error) {
        console.error('socket disconnect', error);
    });

    this.socket.on('connect_failed', function (error) {
        console.error('socket connect_failed');
    });
}

Серверная сторона:

io.sockets
.on('connection', socketioJwt.authorize({
    secret: environment.secret,
    timeout: 15000,
    callback: false
})).on('authenticated', function (socket) {
    clients[socket.decoded_token.id] = socket.decoded_token.login;
    console.error('Connected: ', socket.decoded_token.login);

    socket.on('message', async function (data) {
        try {
            // Проверка что пользователь пишите от себя
            if (data.from === socket.decoded_token.id) {
                data.totalCount = await db_helper.saveMessage(data);
                if (clients[data.from] && clients[data.to]) {
                    io.sockets.connected[clients[data.to].socket].emit("message", data);
                    console.log("Sending from: " + clients[data.from].name + " to: " + clients[data.from].name + " '" + data.text + "'");
                } else {
                    console.log('User does not exist: from=>', data.from, ':', clients[data.from], 'to=>', data.to, ':', clients[data.to]);
                }
            }
        }
        catch (error) {
            console.error(error.message);
        }
    });

    //Removing the socket on disconnect
    socket.on('disconnect', function () {
    });
});

enter image description here

1 Ответ

0 голосов
/ 02 ноября 2018

Это происходит потому, что всякий раз, когда ваш сервер / клиент отключается, создается новый сокет для повторного подключения и для установления нового подключения, т. Е. Повторного подключения. Сервер отключает все свое предыдущее подключение от того же клиента, этот процесс является асинхронным и, таким образом, не виден разработчикам легко.

Я бы также проверил, если выполненное переподключение моего сокета переподключено к, по умолчанию сокет переподключается к порту, к которому подключен ваш клиент.

если это так, то вам нужно восстановить соединение с помощью io (менеджер сокетов)

Существует также вероятность того, что ваше клиентское соединение установлено на false, вы можете проверить свойства вашего сокета, утешая его следующим образом:

`this.socket.on('disconnect', function (error) {
console.log('disconnected', this)
//this sets whether the re connection is allowed or not
this.io._reconnection = true;
});

this.socket.on('reconnect', (error, callback) => {
console.log('reconnect succesfully', this);
//connect to the previously connected socket.
this.io.socket.reconnect()
});`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...