Предварительное условие: - Базовые знания node, express, паспорт и socket.io
Прежде чем начать этот рассказ, я предполагаю, что у всех вас есть базовые знания о Node, Express и Socket.io. Итак, многие из нас всегда пытались создать базовое приложение веб-чата в socket.io, где пользователь может взаимодействовать с разными пользователями в режиме реального времени, но вы, возможно, столкнулись с той же проблемой для нескольких вкладок, например, как вы видите в Facebook, если у вас открыто несколько вкладок, то уведомления появляются на всех активных вкладках, а также, если вы выйдете из одной вкладки, тогда все остальные вкладки станут неактивными, поэтому сегодня мы попытаемся реализовать тот же сценарий, используя Socket.io,
Идея проста: мы поместим все сокеты конкретного пользователя в массив с ключом в качестве используемого идентификатора, а затем передадим сообщение всем этим сокетам.
В приведенном выше коде всякий раз, когда на сервер приходит новый запрос на соединение, он проверяет, присутствует ли этот ключ имени пользователя в объекте activeUsers, если нет, то мы создаем новый ключ с именем пользователя, в котором мы храним userDetails и массив всех сокетов. id, где socketDetails хранятся в другом объекте activeSockets, и если это имя пользователя уже существует (т. е. пользователь использует несколько вкладок), нам просто нужно вставить сокет в массив activeSockets, выполнив все это, и теперь мы можем хранить несколько сокетов. запрос конкретного пользователя.
Итак, теперь всякий раз, когда сервер получит какой-либо запрос на новое уведомление, он будет искать конкретное использование и перебирать все сокеты, чтобы выдавать одни и те же данные уведомления для всех сокетов (разные вкладки), обратите внимание, что мы не можем использовать здесь функцию широковещания, потому что мы хотим это уведомление должно быть отправлено только тем сокетам, которые связаны с конкретным пользователем. Далее мы увидим, как отключить конкретную вкладку, поэтому может быть два типа критериев отключения.
- Пользователь закрыл вкладку, и нам нужно отключить этот сокет
- Мы намеренно хотим отключить сокет, например, вы хотите, чтобы эта вкладка не получала уведомления, если они не используются в течение 30 минут.
Для первого сценария здесь событие отключения запускается внутренне в состоянии этого сокета, поэтому здесь мы не получим имя пользователя в объекте данных, поэтому нам нужно получить имя пользователя из объекта activeSocket, как только мы получим это имя пользователя, мы сможем получить все сокеты этого пользователя и вытащите этот конкретный socketId из массива сокетов объекта activeUser, а затем проверьте, пуст или нет массив погодных сокетов, и если он пуст, это означает, что пользователь сейчас отключен, и мы можем удалить этого пользователя из объекта activeUsers. Во втором сценарии нам нужно активировать событие со стороны клиента, чтобы выполнять ту же функцию, что и в событии отключения.
Также вы можете применять запросы к базе данных и многие другие операции для управления пользователями. Это конец статьи. Следующая статья будет посвящена теме «Как создать приложение для чата в реальном времени без использования Socket.io в Nodejs».