Да, вам обязательно нужно socketId
, чтобы отправлять и получать сообщения между двумя конкретными пользователями.
UserId
требуется только для отслеживания socketId
, связанного с конкретным пользователем, или вы можете управлять им другим способом, а также на ваше усмотрение.
По вашему вопросу у вас есть userId
пользователя, и вам нужно socketId
этого пользователя! Таким образом, в этом случае вы можете передать userId
, когда это конкретное соединение подключается к серверу сокетов со стороны клиента, как показано в следующем фрагменте,
const socket = io(this.SOCKET_SERVER_BASE_URL, { query: `userId=${userId}` });
И вы можете прочитать этого пользователя на сервере nodejs следующим образом:
const userId= socket.request._query['userId'],
const socketId= socket.id
Теперь сохраните этот socketId
где-нибудь, например, в Redis или в каком-то другом механизме кеширования, только убедитесь, что выборка и получение должны быть быстрыми.
Теперь при отправке сообщения просто извлеките socketId
из своего кэша и отправьте сообщение на этом socketId
, используя приведенный ниже код,
io.to(socket.id).emit(`message-response`, {
message: 'hello'
});
Я написал полный пост в блоге на эту тему на Angular и AngularJs , вы также можете отослать их.
Редактировать 1:
Часть 1 =>
Когда ваш пользователь выполнит запрос на вход, установите соединение с сервером сокетов.
Предполагая, что вы используете React Or Angular После успешного входа вы перенаправите своего пользователя на домашний компонент (страница). На домашнем компоненте (странице) подключите сервер сокетов, передав userId
, например,
const socket = io(SOCKET_SERVER_BASE_URL, { query: `userId=${userId}` });
P.S. Вы можете получить идентификатор пользователя из URL или, возможно, использовать cookie-файл на ваше усмотрение.
Как только вы получите этот запрос на подключение к сокету на сервере, вы можете прочитать запрос userID
, связать с ним socketId и сохранить его в кеше, например,
io.use( async (socket, next) => {
try {
await addSocketIdInCache({
userId: socket.request._query['userId'],
socketId: socket.id
});
next();
} catch (error) {
// Error
console.error(error);
}
});
Часть 2 =>
Теперь предположим, что у вас есть список пользователей на стороне клиента, и вы хотите отправить сообщение определенным пользователям.
socket.emit(`message`, {
message: 'hello',
userId: userId
});
На стороне сервера извлеките socketId
из кэша, используя UserId
. Как только вы получите socketId из кэша, отправьте конкретное сообщение, подобное этому,
io.to(socketId).emit(`message-response`, {
message: 'hello'
});
Надеюсь, это поможет.