2016-03-23 52 views
3

我想跟踪当前在我的应用程序页面上的所有客户。我基本上正在实施类似于Google Doc上的实时用户列表。跟踪当前在一个页面上的客户

enter image description here

一个天真的做法是在一个时间间隔发送心跳到服务器,当客户端在页面上。

作为替代方案,我想实现以下:

  1. 一旦客户端连接,推动用户id到一个阵列中的分贝
  2. 观察与所述连接ID的DDP连接
  3. 在DDP连接关闭时拔出userId

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

编辑

我想只跟踪某个页面上的用户的状态。因此meteor-user-status将不适合我的需求。

此外,我想跟踪匿名客户端(谁没有登录的用户)

回答

1

你建议的数据结构是完全合理的。无需过度考虑!

一个小小的复杂情况是,您可能必须手动管理您自己的observeChanges为您推送userIds的数据库中的数组。这是因为流星出版物在$in查询中没有反应,我假设你会用它来做类似db.users.find({_id: {$in: arrayOfUsersOnPage}})的事情。

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

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

这是本机响应。

显然是的,你必须手动推/拉页面id到用户文件。在我看来,最简单的方法是在每个页面特定的模板事件和onDestroyed期间。

匿名用户使用第二种实现方法变得有点棘手,因为他们没有用户文档进行非规范化处理。如果这是一项要求,我会首先为每个包含一组连接用户的页面创建一个文档。


当用户加载某个网页要实际检测,我会建议使用在大火中onCreated钩或(显然)在作出反应ComponentDidMount。阅读更多here

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

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

+0

谢谢。你能否添加更多信息?你说我的想法是可行的:你可以编辑答案来解释当用户连接到特定页面时,我可能如何获得唯一的连接ID和用户信息?我已经看过'Meteor.onconnection',但我不能只在某个页面上调用它。 –

+0

另外,如果我依赖'onCreated'和'onDestroyed',我不认为我可以解释当用户退出浏览器选项卡时的情况。我正在使用React,所以相当于'ComponentDidMount'和'ComponentWillUnmount',但同样的问题成立。 –

+0

当然,请参阅上文。 – tyleha