Meteor 跟踪页面上当前的客户端
我想在我的应用程序中跟踪当前页面上的所有客户端。我基本上实现了一些类似于GoogleDoc上的实时用户列表的东西 一种简单的方法是,当客户端在页面上时,每隔一段时间向服务器发送心跳信号 作为替代方案,我正在考虑实施以下措施:Meteor 跟踪页面上当前的客户端,meteor,ddp,Meteor,Ddp,我想在我的应用程序中跟踪当前页面上的所有客户端。我基本上实现了一些类似于GoogleDoc上的实时用户列表的东西 一种简单的方法是,当客户端在页面上时,每隔一段时间向服务器发送心跳信号 作为替代方案,我正在考虑实施以下措施: 客户端连接后,将userId推送到数据库中的一个数组中 使用连接ID观察DDP连接 在DDP连接关闭时提取用户ID 但我不知道这是否可行。有没有更好的解决方案的想法或建议 编辑 我只想跟踪某个页面上用户的状态。因此不适合我的需要 此外,我还想跟踪匿名客户端(未登录的用户)
此外,我还想跟踪匿名客户端(未登录的用户)您建议的数据结构非常合理。不用想太多了 一个稍微复杂的问题是,您可能必须手动管理自己的
observeChanges
,以便将用户ID推送到数据库中的数组。这是因为meteor发布在查询中对$没有反应,我假设您会使用该查询执行类似于db.users.find({u id:{$in:arrayOfUsersOnPage}})
如果您想避免这种复杂性(我知道我是这样做的),那么您可以将此信息直接反规范化到userDoc。当用户点击路由时,您可以将他们所在页面的唯一ID推送到其用户文档上的数组中,如connectedPages
。然后,您的页面只需订阅:
db.users.find({connectedPages: '_id_of_this_page})
这是天生的反应
显然是的,您必须手动将页面id推/拉到用户文档中。在我看来,最简单的方法是在特定于每个页面的模板和事件期间
匿名用户使用第二种实现方法会变得有点棘手,因为他们没有用户文档要去规范化。如果这是一个要求,我会同意您的第一个想法,即为每个包含连接用户数组的页面创建一个文档
为了实际检测用户何时加载给定网页,我建议使用Blaze中的钩子或(显然)React中的组件didmount
。阅读更多
为了检测页面退出,我发现Meteor的出版物onStop
是可靠的。可以找到一个很好的讨论。其他人会用一个简单的心跳来做这件事,我个人认为这是一件非常不起眼、笨重但可靠的事情
关于如何唯一地标识每个用户,显然登录的用户将具有Meteor.userId()
。对于那些未登录的用户,您应该依赖Meteor.connection.\u lastSessionId
,它仅在服务器端可用。使用此已连接用户列表更新页面文档服务器端,然后确保页面已通过上述讨论发布到所有已连接的客户端,并且您应该拥有所需的数据 谢谢。你能补充更多的信息吗?你说我的想法是可行的:你能编辑答案来解释当用户连接到特定页面时,我如何获得唯一的连接id和用户信息吗?我看过Meteor.onconnection,但我不能只在某个页面上调用它。此外,如果我依赖于onCreated
和onestroyed
,我想我无法解释用户退出浏览器选项卡时的情况。我使用的是React,因此等价物是ComponentDidMount
和ComponentWillUnmount
,但同样的问题仍然存在。当然,请参见上文。您使用出版物的建议非常巧妙。我可以在发布函数中更新页面文档,并使用onStop
注册回调,以便在客户端断开连接时从文档中提取用户id。谢谢你。