Meteorjs - Онлайн-пользователи

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

Ответ 1

Мне удалось найти способ сделать это, не используя неэффективные keep-alives. В основном, пользовательские логины или повторные подключения устанавливают значение profile.online в true, а отключение или отключение - false. Вы можете добавить его как интеллектуальный пакет Meteorite и попробовать его здесь:

https://github.com/mizzao/meteor-user-status

Исправлены исправления или улучшения.

Ответ 2

Мы выполнили это, установив онлайн-свойство, когда пользователь входит в систему, а затем периодически пинговая (каждые 10 секунд) и установка любых неактивных пользователей в автономном режиме. Не идеальный, но он работает. Хотелось бы увидеть эту особенность в Метеор. Вот функция pinging.

Meteor.setInterval(function () {
  var now = (new Date()).getTime();
  OnlineUsers.find({'active':true,'lastActivity': {$lt: (now - 30 * 1000)}}).forEach(function (onlineActivity) {
    if(onlineActivity && onlineActivity.userId) {
      OnlineUsers.update({userId:onlineActivity.userId},{$set: {'active': false}});
      Meteor.users.update(onlineActivity.userId,{$set: {'profile.online': false}});
    }
  });
}, 10000);

Ответ 3

Старый вопрос, но для тех, кто смотрит в это, теперь есть пакет метеоров, который отслеживает соединения клиента с сервером. Он называется статусом пользователя метеора и может быть найден в github.

Ответ 4

То, что я делаю, - это запись состояния пользователя в режиме онлайн, когда вкладка браузера приложения метеоров имеет или теряет фокус. Затем отфильтруйте пользователей, которые находятся в сети. Должны быть лучшие решения, но это работает.

if Meteor.is_client
  Meteor.startup ->
    $(window).focus ->
      Meteor.call 'online', true

    $(window).blur ->
      Meteor.call 'online', false
else
  Meteor.methods
    online: (isOnline=true) ->
      Meteor.users.update Meteor.userId(), $set: online: isOnline

Затем вы можете использовать

Meteor.users.find online: true

для фильтрации онлайн-пользователей.

BTW, не забудьте опубликовать пользователей в онлайн-поле.

Meteor.publish null, ->
  Meteor.users.find {}, fields: online: 1

Ответ 5

Я закончил с этим. Код сервера:

Meteor.startup ->
  Meteor.methods
    keepalive: (params) ->
      return false unless @userId
      Meteor.keepalive ?= {}
      Meteor.clearTimeout Meteor.keepalive[@userId] if Meteor.keepalive[@userId]
      Meteor.users.update @userId, $set: {'profile.online': true}
      Meteor.keepalive[@userId] = Meteor.setTimeout (=>
        delete Meteor.keepalive[@userId]
        Meteor.users.update @userId, $set: {'profile.online': false}
      ), 5000
      return true

Клиентский код:

Meteor.startup ->
  Meteor.setInterval (->
    Meteor.call('keepalive') if Meteor.userId()
  ), 3000

Ответ 6

Моя рекомендация для этого случая danimal:userpresence, потому что есть еще несколько преимуществ:

  • Отслеживать онлайн-статус пользователя на нескольких серверах.
  • Содержит httpHeaders, поэтому, если вы хотите проверить, проверял ли получатель текущие сообщения или нет,
  • Очень простой код для чтения