跟踪当前页面上的客户端

时间:2016-03-23 05:18:52

标签: meteor ddp

我想跟踪我应用中当前页面上的所有客户。我基本上在Google Doc上实现类似于实时用户列表的内容。

enter image description here

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

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

  1. 客户端连接后,将userId推送到db
  2. 中的数组
  3. 使用连接ID
  4. 观察DDP连接
  5. 关闭DDP连接时拉出userId
  6. 但我不知道这是否可行。任何想法或建议更好的解决方案?

    修改

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

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

1 个答案:

答案 0 :(得分:1)

您建议的数据结构非常合理。无需过度思考!

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

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

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

是原生反应性的。

显然是的,您必须手动将页面ID推送/拉到用户文档。我想到的最简单的方法是在每个页面特定的onDestroyed模板事件中。

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

要实际检测用户何时加载指定网页,我建议您使用Blaze中的onCreated挂钩或(显然)使用React中的ComponentDidMount。阅读更多here

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

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