Есть ли способ получить список всех подключенных в данный момент пользователей? Я проверил многие из чат-уроков, и ни одна из них не предоставляет эту методологию. Возможно ли это, и если да, то как это сделать, чтобы правильно реализовать путь Метеор?
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, поэтому, если вы хотите проверить, проверял ли получатель текущие сообщения или нет,
- Очень простой код для чтения