【问题标题】:Meteor, get all users on a specific pageMeteor,获取特定页面上的所有用户
【发布时间】:2014-06-25 12:00:42
【问题描述】:

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

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

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

【问题讨论】:

标签: meteor user-presence


【解决方案1】:

你可以这样做:

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

以及您跟踪的页面

Meteor.subscribe('page');

我在analytics 大气包中使用它

【讨论】:

    【解决方案2】:

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

    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') } })
    

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

    【讨论】:

    • 如果我想存储用户当前所在的一组房间,这会起作用吗? IE。一个用户同时在 5 个房间,我想知道他们在的所有房间。
    【解决方案3】:

    Meteor 具有connection hooks,因此您可以在用户与服务器断开连接时运行函数。在客户端调用的方法中设置 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}})
        });    
      }
    });
    

    【讨论】:

    • 我不认为这会起作用,因为这只会在用户在线时处理,而不是用户活跃在哪些房间。
    • 难道你不能在每次用户改变或离开房间时调用一个方法(可能来自路由器)?如果您可以维护他们在活动时所在的房间列表,那么还可以维护一个 onClose() 函数以在他们离线时将其删除。我并不是要写一个完整的解决方案,只是一个基本的功能示例。
    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 2015-12-16
    • 2020-07-23
    • 1970-01-01
    相关资源
    最近更新 更多