跟踪当前页面上的客户

Keep track of clients currently on a page

我想跟踪当前在我的应用程序页面上的所有客户。我基本上是在 Google Doc.

上实现类似于实时用户列表的功能

一种天真的方法是,当客户端在页面上时,每隔一段时间向服务器发送一个心跳。

作为替代方案,我正在考虑实施以下内容:

  1. 客户端连接后,将 userId 推送到数据库中的数组
  2. 观察连接ID为
  3. 的DDP连接
  4. DDP连接关闭时拉取userId

但我不知道这是否可行。有更好的解决方案的想法或建议吗?

编辑

我只想跟踪特定页面上的用户状态。因此 meteor-user-status 不适合我的需要。

我还想跟踪匿名客户(未登录的用户)

您建议的数据结构非常合理。没必要想太多!

一个轻微的并发症是您可能必须手动管理您自己的 observeChanges 用于您将 userIds 推送到的数据库中的数组。那是因为 meteor 出版物对 $in 查询没有反应,我假设你会用它来做类似 db.users.find({_id: {$in: arrayOfUsersOnPage}}) 的事情。

如果您想避免这种复杂性(我知道我这样做),那么您可以将此信息直接反规范化到 userDoc。当用户点击路由时,您可以将他们所在页面的唯一 ID 推送到他们的用户文档中的数组,例如 connectedPages。然后,您的页面只需要订阅:

db.users.find({connectedPages: '_id_of_this_page})

它本身就是反应性的。

显然是的,您必须手动 push/pull 将页面 ID 添加到用户文档。在我看来,最简单的方法是在每个页面特定的 onDestroyed 模板事件期间。

匿名用户使用第二种实现方法会有点棘手,因为他们没有要反规范化的用户文档。如果这是一个要求,我会按照您的第一个想法,为每个包含一组已连接用户的页面创建一个文档。


要实际检测用户何时加载给定网页,我建议使用 onCreated hook in Blaze or (apparently) the ComponentDidMount in React. Read more here

为了检测页面退出,我发现 Meteor 的出版物 onStop 是可靠的。可以找到一个很好的讨论here。其他人会用一个简单的心跳来做到这一点,我个人认为这是非常不流星和繁琐的,但可靠。

关于如何唯一标识每个用户,显然登录的会有Meteor.userId()。对于未登录的用户,您应该依赖仅在服务器端可用的 Meteor.connection._lastSessionId。使用此已连接用户列表更新您的页面文档服务器端,然后确保该页面已通过上面的讨论发布到所有已连接的客户端,并且您应该拥有所需的数据!