2011-12-09 57 views
1

我有一个用户登录并连接到所有页面上的NowJS的站点。我希望能够近乎实时地跟踪他们的状态(在线/离线),但我不确定最好的方式来做到这一点。我最初的想法是只使用connect和disconnect事件,但这不起作用,因为每次用户进入新页面时都会触发这些事件(因为在新页面加载时关闭套接字连接)。使用NowJS/Node.js实时跟踪在线/离线状态?

我有点工作,我在断开连接事件中为该用户的数据库条目记录时间戳,然后当连接事件触发时,我检查他们是否在最近30秒内访问过该网站。如果他们没有,我可以假设他们正在开始一个新的会议。在断开事件中,我使用setTimeout来查看它们是否从现在起30秒仍处于联机状态,如果不是,则将其状态设置为脱机状态。

虽然这主要是工作,它似乎有点哈克,有可能是有问题的几个边缘情况的问题(更何况事实,你将不得不在每个页面视图中创建新的超时服务器端)。有没有更好的方法来做到这一点,我只是俯瞰?

+0

新页面=新的套接字连接。跟踪每个用户的连接,并且如果他们打开另一个套接字,则忽略断开连接。听起来不错? –

+0

我其实已经这样做了,但仍然存在这样的问题,即如果他们只打开一个页面并且只是点击链接,他们就没有连接打开。我目前将用户的所有连接存储在以其用户名作为名称的组中。 –

回答

0

我最终什么事做了创建适用于用户(所以在这种情况下,它们的ObjectId MongoDB中)作为关键和参考的setTimeout作为值的永久ID全局对象。然后,我在“连接”事件上执行clearTimeout,并在它们被视为脱机时从对象中删除该键。

0

这样做的正确的方式取决于不仅仅是“是否有一个开放的连接”。你是否试图向其他用户显示是否有人在/可以聊天/不管?那么你也可以考虑页面本身的非活动超时(捕捉人们离开计算机而不关闭页面的时间)。如果你正在做别的事情,比如计量使用量,你可能需要一个不同的机制。

+0

没错,但这更像是一个功能,而不是知道他们是否在线的核心功能。正试图尽可能简化示例。 –

0

我认为这里的解决方案是延长Socket.IO超时选项(NowJS使用这个内部),或者使用带有setTimeout的哈克的解决方案。

老实说,似乎最好的解决方案考虑用户可以快速移动到另一页。

+0

你是否说过socket.io有一种方法在服务器上不会触发断开连接事件,直到发生特定时间? –

+1

是的,看看这里https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO在心跳超时并关闭超时PARAMS。 – alessioalex

+0

这些默认值分别是15秒和25秒,所以除非我遗漏了一些东西,否则不会这么做。 –