2012-11-15 65 views
2

我正在研究使用Node.js和Socket.IO的实时跟踪应用程序。在我的目标网站上的tracking code中,我有一些代码可以获取浏览器的用户代理字符串并将其发送回服务器。这USUALLY工作正常,但有几次该数据设置为undefined(this is where it happens)。客户端浏览器的Socket.IO检测有时会失败

现在,我只是在服务器上有一个巨大的try/catch块,因此在运行我定义的方法来检测它是什么浏览器时不会崩溃(it crashes when it tries to run the match() method)。我假设这是从机器人或其他没有用户代理或被篡改的浏览器发生的。我错了吗?还有其他原因吗?

Socket.IO提供任何浏览器检测?无论哪种方式,我知道我需要使浏览器检测功能更强大,但我只是把这个项目放在了地面上。

如果没有更好的方法来做到这一点,我最好只检查发送到服务器的数据是否是未定义的,并将其视为“其他”浏览器?

enter image description here

见连接总数和总人数的浏览器的区别?目前,有一点差距超过100.如果这个浏览器跟踪问题没有发生,数字应该完全相同(因为每个连接都会有浏览器,分辨率,操作系统和URL)。

回答

3

这实际上与机器人或篡改数据无关,就像我认为的那样。我的问题是由于罕见的竞争状态,客户端连接到服务器但在将数据发送到服务器之前断开连接(我设置的“beacon”事件是客户端发送数据和服务器接收它的位置)。因此,当客户端断开连接时,我的服务器会查找客户端,但会返回未定义的结果,因为数据从未发送并存储在第一位。一个有益的经验,但多么痛苦!

6

我对socket.io并不是很熟悉,但看起来您可以在socket.handshake.headersSocket.io's Wiki – Authorizing)中获取请求标头。我不知道哪些浏览器运行JavaScript,但没有设置navigator.userAgent,但也许他们会发送User-Agent HTTP标头?

+3

对于任何感兴趣的用户来说,用户代理键是标题对象中的“用户代理”。 – franzlorenzon

+1

我最终修改了服务器,以便从头文件获取更多信息,而不是通过跟踪代码发送。当我在高流量的网站上尝试时,非常有帮助并减少了带宽消耗! – Aaron

相关问题