2016-03-23 2 views
3

Я хотел бы отслеживать всех клиентов, находящихся на странице в моем приложении. Я в основном реализую нечто похожее на список живых пользователей в Google Doc.Отслеживать клиентов, которые в настоящее время находятся на странице

enter image description here

Наивный подход будет отправить сердцебиения на сервер с интервалом, когда клиент находится на этой странице.

В качестве альтернативы, я имею в виду осуществление следующих действий:

  1. После того, как клиент подключается, нажмите USERID на массив в БД
  2. Соблюдать соединение DDP с соединительным ID
  3. Потяните userId, когда соединение DDP закрыто.

Но я не знаю, возможно ли это. Любые идеи или предложение для лучшего решения?

Редактировать

Я хотел бы только отслеживать статус пользователей на определенной странице. Поэтому meteor-user-status не подойдет моим потребностям.

Также я хочу, чтобы отслеживать анонимных клиентов (пользователей, которые не вошли в систему)

ответ

1

Ваша рекомендованная структура данных является вполне разумным. Нет необходимости переубеждать!

Одним из незначительных осложнений является то, что вам, возможно, придется вручную управлять своим собственным observeChanges для массива в db, на который вы нажимаете userIds. Это потому, что публикации метеоров не реагируют на запрос $in, который, как я полагаю, вы будете использовать, чтобы сделать что-то вроде db.users.find({_id: {$in: arrayOfUsersOnPage}}).

Если вы хотите избежать этой сложности (я знаю, что знаю), вы можете денормализовать эту информацию непосредственно в userDoc. Когда пользователь набирает маршрут, вы можете нажать уникальный идентификатор страницы, на которой они находятся, на массив в своем пользовательском документе, например connectedPages. Затем вашей странице просто нужно будет подписаться на:

db.users.find({connectedPages: '_id_of_this_page}) 

, который изначально реагирует.

Очевидно, что да, вы должны вручную нажать/вывести идентификатор страницы в пользовательский документ. Самый простой способ сделать это на мой взгляд будет в течение и onDestroyed событий шаблона, характерных для каждой страницы.

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


Чтобы действительно определить, когда пользователь загружает данную страницу, я предложил бы использовать onCreated крюк в Blaze или (по-видимому) в ComponentDidMount в React. Подробнее here.

Чтобы обнаружить выход страницы, я нашел публикацию Метеор onStop, чтобы быть надежным. Хорошее обсуждение можно найти here.Другие могли бы сделать это с простым пульсом, которое я лично считаю очень не-Метеорным и громоздким, но надежным.

Относительно того, как однозначно идентифицировать каждого пользователя, очевидно, что вошедшие в систему будут иметь Meteor.userId(). Для тех, кто не вошел в систему, вы должны полагаться на Meteor.connection._lastSessionId, который доступен только на стороне сервера. Обновите сервер страницы на странице с этим списком подключенных пользователей, а затем убедитесь, что страница будет опубликована для всех подключенных клиентов через вышеперечисленное, и вы должны иметь нужные данные!

+0

Спасибо. Не могли бы вы добавить дополнительную информацию? Вы сказали, что моя идея возможна: не могли ли вы отредактировать ответ, чтобы объяснить, как я могу получить уникальный идентификатор соединения и информацию о пользователе, когда пользователь подключается к определенной странице? Я посмотрел на «Meteor.onconnection», но я не могу назвать это только на определенной странице. –

+0

Кроме того, если я полагаюсь на 'onCreated' и' onDestroyed', я не думаю, что могу объяснить ситуацию, когда пользователь покидает вкладку браузера. Я использую React, поэтому эквивалент будет «ComponentDidMount» и «ComponentWillUnmount», но тот же вопрос сохраняется. –

+0

Несомненно, смотрите выше. – tyleha

Смежные вопросы