@ArtemAvdeyev

Почему disconnect работает не правильно?

Здравствуйте, недавно я начал изучать socket.io. С помощью них я хочу отображать всех пользователей, кто сейчас находится онлайн. Вроде бы все получается, но вот только отключение пользователя работает не так, как запланировано. Логика такова: при посещении сайта, пользователь присылает свой логин на сервер, и тот записывает его в массив пользователей, находящихся онлайн. При выходе, логин пользователя удаляется из массива пользователей, находящихся онлайн. Но, при выходе одного пользователя, всех пользователей выписывает из массива. Из-за чего это происходит?

Server

const users = [];

    io.on('connection', (socket) => {
        socket.on('global room', (global) => {

            socket.login = global.login;
            users.push(socket.login);

            socket.join(global.room);

            socket.emit('onlineUsers', users);
        });

        socket.on('disconnect', () => {
            users.splice(socket.login, 1);
            socket.emit('onlineUsers', users);
        })
    });


Client

var socket = io();

    socket.on('connect', function(){

        var room = 'global room';
        var userLogin = $('#userLogin').val();

        socket.emit('global room', {
            room: room,
            login: userLogin
        });

        socket.on('onlineUsers', function(users){
          console.log(users);
        });
    });
  • Вопрос задан
  • 225 просмотров
Решения вопроса 1
@ArtemAvdeyev Автор вопроса
Изменил

users.splice(socket.login, 1);

на

users = users.filter(login => login !== socket.login);


И всё заработало корректно
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@StockholmSyndrome
метод splice ждёт в качестве первого аргумента индекс элемента массива, с которого нужно начать удалять, а вы передаёте сам элемент
правильно будет так:
users.splice(users.indexOf(socket.login), 1);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы