使用NowJS / Node.js实时跟踪在线/离线状态?

时间:2011-12-09 20:05:41

标签: javascript node.js nowjs-sockets

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

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

虽然这大部分都有效,但它似乎有点hacky并且有几个边缘案例问题可能会有问题(更不用说你将在每个页面视图上有一个新的超时服务器端)。有没有更好的方法来做到这一点,我只是忽略了?

3 个答案:

答案 0 :(得分:0)

这样做的正确方法不仅仅取决于'是否存在开放连接'。您是否试图向其他用户显示是否有人在/可以聊天/等等?然后,您可能还会考虑页面本身的非活动超时(捕获人们离开计算机而不关闭页面的时间)。如果你正在做其他事情,比如计量用法,你可能需要一种不同的机制。

答案 1 :(得分:0)

我认为这里的解决方案是扩展Socket.IO的超时选项(NowJS在内部使用它)或者使用你的hacky解决方案和setTimeout。

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

答案 2 :(得分:0)

我最终做的是创建一个全局对象,该对象保存用户的持久ID(在本例中为MongoDB中的ObjectId)作为键,并将setTimeout作为值引用。然后我在'connect'事件上执行clearTimeout,并在它们被认为脱机时从对象中删除密钥。