Meteor 跟踪页面上当前的客户端

Meteor 跟踪页面上当前的客户端,meteor,ddp,Meteor,Ddp,我想在我的应用程序中跟踪当前页面上的所有客户端。我基本上实现了一些类似于GoogleDoc上的实时用户列表的东西 一种简单的方法是,当客户端在页面上时,每隔一段时间向服务器发送心跳信号 作为替代方案,我正在考虑实施以下措施: 客户端连接后,将userId推送到数据库中的一个数组中 使用连接ID观察DDP连接 在DDP连接关闭时提取用户ID 但我不知道这是否可行。有没有更好的解决方案的想法或建议 编辑 我只想跟踪某个页面上用户的状态。因此不适合我的需要 此外,我还想跟踪匿名客户端(未登录的用户)

我想在我的应用程序中跟踪当前页面上的所有客户端。我基本上实现了一些类似于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。谢谢你。