跟踪当前页面上的客户
Keep track of clients currently on a page
我想跟踪当前在我的应用程序页面上的所有客户。我基本上是在 Google Doc.
上实现类似于实时用户列表的功能
一种天真的方法是,当客户端在页面上时,每隔一段时间向服务器发送一个心跳。
作为替代方案,我正在考虑实施以下内容:
- 客户端连接后,将 userId 推送到数据库中的数组
- 观察连接ID为
的DDP连接
- 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
。使用此已连接用户列表更新您的页面文档服务器端,然后确保该页面已通过上面的讨论发布到所有已连接的客户端,并且您应该拥有所需的数据!
我想跟踪当前在我的应用程序页面上的所有客户。我基本上是在 Google Doc.
上实现类似于实时用户列表的功能一种天真的方法是,当客户端在页面上时,每隔一段时间向服务器发送一个心跳。
作为替代方案,我正在考虑实施以下内容:
- 客户端连接后,将 userId 推送到数据库中的数组
- 观察连接ID为 的DDP连接
- 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
。使用此已连接用户列表更新您的页面文档服务器端,然后确保该页面已通过上面的讨论发布到所有已连接的客户端,并且您应该拥有所需的数据!