我的网站包含将JavaScript错误记录回Web服务器(Apache)的代码,使用AngularJS中的$ exceptionHandler和Angular代码中的异常组合,以及通过window.onerror组合在Angular之外发生的事情。
最近记录的许多错误表明客户端似乎随机地无法请求一个或另一个资源。到目前为止,我找不到未提取的特定资源或显示该问题的浏览器或客户端设备之间的任何关联。
例如,我网页上的一个JavaScript资源称为' utility.js'。这包括一些全球功能和网站的其他常见内容。 iPhone用户(在iOS 10.3.2上)今天加载了一个页面并获取了除utility.js之外的页面的所有资源(我查看了会话的Apache访问日志,并且可以看到所请求页面中标识的所有其他资源 - 并按正确的顺序 - 但不是utility.js,并且在同一时间范围内的错误日志中没有任何内容)。一秒钟之后,由于未定义的utility.js中定义的全局函数,从手机向我们的服务器记录了JavaScript错误。
另一个(更常见的)示例是AngularJS在尝试访问HTML模板资源时生成$compile:tpload错误。我每天都会收到其中的几个。有问题的模板在错误的实例之间有所不同,但在我审查的情况下,Apache日志中没有证据表明模板资源的请求。已成功加载同一页面的其他模板资源。值得注意的是,在这种情况下,我有时会看到同一个客户端在几分钟内多次记录有关同一资源的错误,这表明用户正在重新加载页面并遇到同样的问题,所以似乎确实存在某些问题。坚持'或者在浏览器中阻塞,但我无法想象是什么。
我有理由相信这些资源不会缓存在用户中。浏览器已经像我查看过的情况一样,页面上的其他资源被请求,如果页面已经加载则不会这样。
我现在还不知道该问题该去哪里。据我所知,我无法了解浏览器页面的网络流量。
有关如何进一步诊断此问题的任何建议?
答案 0 :(得分:0)
看起来这是$ compile:tpload错误(至少很大一部分)的原因,如果不是可能还有其他错误:
https://github.com/angular/angular.js/issues/14219
基本上,Chrome和Firefox似乎错误地(?)为因卸载页面而中止的XHR请求生成错误事件(即重新加载或导航)。在我的情况下,客户端必须在飞行中请求角度模板,这些模板在重新加载或导航时会中止...也许它们处于慢速网络连接并且在加载页面时出现问题,因此尝试重新加载。
我通过在其中一个模板中插入PHP sleep()请求来重现错误,以防止Apache立即响应。如果我加载页面,然后重新加载或导航,则相应地记录$ compile:tpload错误。我还发现,只有在响应时,Apache才会在访问日志文件中记录请求,这至少在某种程度上解释了我在那里观察到的行为(虽然不完全!)
它没有解释IE11发生错误的事件 - 我无法用它重现它。它也没有解释为什么绝大多数事件都在Android设备上。
总之,有些进展,但我还没有得到所有答案。至少这对某些人来说可能是半有用的!