Вы можете аутентифицировать соединение socket.io в событии 'connection' или с помощью промежуточного программного обеспечения - do c.
Также вы можете использовать какой-то пакет из npm, например this
После аутентификации сохраните пользовательские данные в объекте сокета или в виде отдельного объекта в области действия 'connection' .
io.on('connection', (socket) => {
const handshake = socket.handshake;
const user = // fetch user obj according data in handshake, for example, from jwt token in header
});
Таким образом, после того, как вы сможете использовать объект пользователя в других событиях для этого соединения.
Личные сообщения в соответствии с вашей задачей, которую я реализовал в своем проекте с использованием комнат. Вот абстрактный пример:
// this is just a helper to get room name according to userId
getUserRoomName(userId) {
return `user_${userId}`;
}
// function to send data to user
sendToUser(userId, event, data) {
io.to(getUserRoomName(userId)).emit(event, data);
}
// in 'connection' event add join to user room
io.on('connection', (socket) => {
const handshake = socket.handshake;
const user = // fetch user obj according data in handshake, for example, from jwt token in header
// join to private room
socket.join(getUserRoomName(user.userId), () => {
// some logic
});
});
Итак, когда пользователь подключается к socket.io, мы присоединяем его подключение к частной комнате пользователя. И каждое соединение одного и того же пользователя будет присоединено к одной и той же комнате, поэтому мы можем изолировать данные, отправляющие сообщения в эту комнату.
Используя метод sendToUser, вы можете отправлять любые типы данных всем пользовательским соединениям из любой части вашего приложения:
sendToUser(userId, 'foo_create', data);
OR
sendToUser(userId, 'foo', {
action: 'create',
// some other data
});