@Scryppi

Как хранить и получать информацию онлайн ли пользователь в node js express и react?

Делаю сайт. react js + express js Надо при просмотре пользователя или при списке пользователей показывать онлайн ли сейчас юзер или кто из списка онлайн. Как это организовать?

Я додумался только до - открывать соединение websocket с статическим id(который не меняется и зависит от юзера) и брать информацию window.addEventListener online, offline и передавать ее по сокету, когда получаю ее делать запись в таблице юзера в mongo db постоянно.

Либо же просто при каждом клике пользователя делать put запрос, передавая поле isOnline true, которое через 5 минут станет снова false если его не продлить.

Есть ли какие-то элегантные и давно отлаженные решения? Можете поделиться ссылкой на статью\библиотеку и как это обычно решается. Может делается через redis?(я его не использовал)
  • Вопрос задан
  • 47 просмотров
Решения вопроса 1
@pro100gram
Как вы и написали - websocket. Создаете обработчик события beforeunload и отправляете на сервер соответствующее сообщение. Но есть проблема, если пользователь закроет браузер, то это событие не сработает. Для этого установите на сервере время отклика, допустим 5 секунд, тогда через 5 секунд, если отклика от клиента не будет, на сервере можно будет вызвать нужный метод для установки пользователю статуса оффлайн.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@d-sem
Во-первых, нужно определиться, что вы считаете онлайном:
1. Пользователь открыл страницу
2. Пользователь совершил какое-либо действие
3. Пользователь находится на странице прям сейчас

Для 1 и 2 определить время отсечения после которого пользователь считается не онлайн. Те 5 минут.
Для третьего это постоянно открытое соединение или систематические запросы с интервалов отсечения.

Во-вторых, определиться - нужна ли история активности.

Все это дело лучше учитывать в отдельной таблице/коллекции. Активные пользователи. Где содержится идентификатор пользователя и его последнее обновление. Если история нужна - будет 2 таблицы. Если нет можно использовать какое-нибудь NoSQL решение с самоочищением базы. А ля закидывать в Memcache id пользователя со сроком жизни 5 минут, а при построении списка онлайн - получать все ключи.

Для сценария 1 достаточно на бекенде сделать запрос к этой таблице/коллекции/хранилище. Немного кода. Никаких запросов на фронте. Все четко.

Для сценария 2 и 3 нужен эндоинт куда будет передавать только id пользователя. На беке при получения запроса - обновляется эта таблица. Этот эндпоинт привязывается или к любому действию на странице (сценарий 2) или ставится на интервальное выполнение (сценарий 3).

В-третьих, задуматься еще раз зачем это нужно Вам. Какие цели вы преследуете. Возможно Вам нужно просто отслеживать сколько у Вас пользователей на странице и что они делают. Может быть Вам на эти вопросы даст ответы аналитика Гугла или Яндекса.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы