0

我们正在构建一个聊天应用程序,目前正在开发一个系统来查看给定房间中的所有用户。

我们设置了一个 Mongo 文档,其中包含active_users我们将要去的地方pushpull用户名的数组,以便跟踪在线用户。我们得出的结论是,实现用户已连接到给定房间是相当简单的。我们需要做的就是在路由器中,当一个用户访问页面时,我们push把那个用户的名字写入到文档中。

现在棘手的部分是意识到该用户何时离开了该给定页面?显然 jQuery 不是一个可靠的选择,那么我们如何知道用户与特定页面的连接何时中断?

4

3 回答 3

0

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}})
    });    
  }
});
于 2014-06-25T04:00:42.867 回答
0

你可以这样做:

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

以及您跟踪的页面

Meteor.subscribe('page');

analytics我在大气包装中使用这个

于 2014-06-24T23:39:57.997 回答
0

有一个名为Presence的 Atmosphere 包可以满足您的需求。

自述文件中有关跟踪自定义状态的一些额外细节......

状态函数

如果您想跟踪的不仅仅是用户的在线状态,您可以设置自定义状态功能。(默认状态函数只返回'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') } })

当然,presence 会响应式地调用你的函数,所以一旦事情发生变化,每个人都会知道。

于 2014-06-25T01:30:13.403 回答