Метеор, получить всех пользователей на определенной странице

Мы создаем приложение для чата и в настоящее время работаем над системой, позволяющей видеть всех пользователей в данной комнате.

У нас есть документ Mongo, настроенный с массивом active_users, где мы будем push и pull именами пользователей, чтобы отслеживать онлайн-пользователей. Мы пришли к выводу, что понять, что пользователь подключился к данной комнате, довольно просто. Все, что нам нужно сделать, это в маршрутизаторе, когда пользователь получает доступ к странице, мы push добавляем имя этого пользователя в документ.

Теперь сложная часть заключается в том, чтобы понять, когда этот пользователь покинул данную страницу? Очевидно, что jQuery не является надежным вариантом, так как же мы узнаем, что соединение пользователя с определенной страницей прервано?


person Scalahansolo    schedule 24.06.2014    source источник
comment
возможный дубликат очистки сервера после отключения клиента   -  person jacksondc    schedule 25.06.2014
comment
код чата для CrowdMapper в основном делает большую часть того, что вы Просишь уже.   -  person Andrew Mao    schedule 25.06.2014


Ответы (3)


Вы можете сделать это:

Meteor.publish("page", function() {
    this._session.socket.on("close", function() { 
        //Change your active users here
    });
});

и для вашей страницы, которую вы отслеживаете

Meteor.subscribe('page');

Я использую это в пакете analytics на атмосфере

person Tarang    schedule 24.06.2014

Существует пакет Atmosphere под названием Presence, который делает именно то, что вам нужно.

Некоторые дополнительные подробности из README об отслеживании пользовательских состояний...

Государственные функции

Если вы хотите отслеживать больше, чем просто онлайн-состояние пользователей, вы можете установить пользовательскую функцию состояния. (Функция состояния по умолчанию возвращает только 'online'):

// Setup the state function on the client
Presence.state = function() {
  return {
    online: true,
    currentRoomId: Session.get('currentRoomId')
  };
}

Теперь мы можем просто запросить коллекцию, чтобы найти всех других пользователей, которые имеют один и тот же currentRoomId.

Presences.find({ state: { online: true, currentRoomId: Session.get('currentRoomId') } })

Конечно, присутствие будет вызывать вашу функцию реактивно, поэтому все узнают, как только что-то изменится.

person JShimko    schedule 25.06.2014
comment
Будет ли это работать, если я захочу сохранить набор комнат, в которых сейчас находится пользователь? т.е. Пользователь находится в 5 комнатах одновременно, и я хочу знать все комнаты, в которых он находится. - person Scalahansolo; 25.06.2014

В Meteor есть перехватчики соединения, поэтому вы можете запускать функцию, когда пользователь отключается от сервера. Установка обратного вызова onClose() внутри метода, вызываемого клиентом, позволит вам закрыть userId в функции.

Код на сервере может быть таким:

Meteor.methods({
  joinRoom: function( roomId ){
    var self = this;
    Rooms.update( {roomId: roomId}, {$push:{userId: self.userId}});

    self.connection.onClose( function(){
      Rooms.update( {roomId: roomId}, {$pull:{userId: self.userId}})
    });    
  }
});
person user728291    schedule 25.06.2014
comment
Я не думаю, что это сработает, потому что это будет работать только в том случае, если пользователь находится в сети, а не точно в каких комнатах он активно находится. - person Scalahansolo; 25.06.2014
comment
Разве вы не можете вызывать метод (возможно, из маршрутизатора) каждый раз, когда пользователь меняет или покидает комнату? Если вы можете поддерживать список комнат, в которых они находятся, пока они активны, также поддерживайте функцию onClose() для их удаления, когда они отключаются. Я не хотел писать полное решение, просто базовый пример функциональности. - person user728291; 26.06.2014