Выдать событие для конкретного пользователя, если функциональность входа в приложение в Socket.io с Node.js - PullRequest
0 голосов
/ 13 января 2019

Я использовал методы socket.on и io.emit, и я получил ответ всем пользователям. Но я хочу получить ответ для конкретного пользователя.

Но мое приложение содержит функцию входа в систему, и я следовал за этой публикацией на stackoverflow, и они говорят , нам нужны уникальные userId и socketId в объекте для конкретного пользователя испустить событие для конкретного пользователя. Но я получаю идентификатор пользователя после входа в систему , но мы хотим, чтобы пользователь подключался к приложению.

Так может кто-нибудь помочь мне с тем же?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Да, вам обязательно нужно 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'
 });

Надеюсь, это поможет.

0 голосов
/ 13 января 2019
  1. В вашем node.js создайте глобальный массив 'aryUser', каждый элемент содержит сокет и логин.

  2. node.js onConnect (новое соединение), добавьте новый элемент в массив с помощью socketid и установите loginid = empty.

  3. после входа в систему пользователя отправить событие от клиента на сервер, например:

socket.emit ('userloginok', loginid)

  1. в файле node.js, определите функцию:

socket.on ('userloginok', loginid)

и в этой функции найдите aryUser с помощью socketid и замените пустой loginid внутри элемента массива на parm loginid.

  1. в файле node.js, определите функцию:

socket.on ( 'разрыв')

и в этой функции найдите aryUser, используйте aryUser.splice (i, 1), чтобы удалить только что отключенного пользователя.

это означает, что aryUser содержит всех подключенных пользователей, некоторые из которых вошли в систему, некоторые из них не вошли в систему. И вы можете использовать сокет массива для отправки сообщения определенному пользователю и / или всем пользователям.

Пример исходного кода:

  1. server.js

http://www.zephan.top/server.js

  1. server.html

http://www.zephan.top/server.html.txt

переименуйте server.html.txt в server.html, поместите server.html и server.js в один каталог и выполните:

узел server.js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...