Показать сообщение отдельно
  #7 (permalink)  
Старый 04.06.2021, 11:56
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

HotReboot,
неправильно так идентифицировать с помощью ника пользователя
socket.io - говно еще то может работать в нескольких режимах transports "polling", "websocket" по дефолту это polling, а в режиме websocket оно не работает по умолчанию
причем в режиме polling можно отпровлять заголовки header, а в websocket такого они не реализовали
к чему я это все
вам нужен transport websocket и в этом режиме вызывать auth где использовать обычный jwt токен для идентификации, всем остальным дисконнект
у клиента может быть несколько сессий
примерно так
const Connections = new Set();
socket.on('auth', token => {
        const user = verifyToken(token);
        if (user) {
            socket.user = user;
            Connections.add(socket);
            redisPub.sadd("users", user.id);
        } else {
            socket.emit('error', {message: 'UNAUTHORIZED'});
            socket.disconnect();
        }
    })
//--------
const send = (msg, users) => {
    Connections.forEach(socket => {
        if ('user' in socket && users.includes(socket.user.id)) {
            socket.emit('message', msg);
        }
    });
};

при этом стоит использовать хотя-бы redis для маштабирования
Использование Redis в качестве брокера сообщений стр 357
Каскиаро М., Маммино Л.
Шаблоны проектирования Node.js / пер. с анг. А. Н. Киселева. – М.: ДМК Пресс,
2017. – 396 с.: ил.
Ответить с цитированием