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 с.: ил.