【问题标题】:Browsers randomly not requesting resources浏览器随机不请求资源
【发布时间】:2017-11-29 11:37:48
【问题描述】:

我的网站包含用于在发生 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 日志中再次没有证据表明对模板资源的请求。同一页面的其他模板资源已成功加载。值得注意的是,在这种情况下,我有时会看到同一个客户端在几分钟内多次记录有关同一资源的错误,这表明用户正在重新加载页面并遇到相同的问题,因此似乎确实存在“卡住”或在浏览器中阻塞,但我无法想象是什么。

我有理由相信,这些资源并没有像我所看到的情况那样缓存在用户的浏览器中,页面上的其他资源被请求,如果页面已经加载,则不会被请求。

目前我真的不知道该去哪里解决这个问题。据我所知,我无法查看我的页面的浏览器网络流量。

关于如何进一步诊断此问题的任何建议?

【问题讨论】:

  • 这种情况只发生在手机上吗?
  • 不...最常见于手机,但在桌面客户端上也观察到。我认为 IE11 对它有特殊的偏好,但并不是孤立的
  • 让我稍微修改一下:大多数 Android + Chrome 58,但在其他设备/浏览器/版本和桌面客户端上也观察到了 - 到目前为止 Windows 7 或 Windows 10 上的 IE11 和 Chrome 58。

标签: javascript angularjs apache error-handling


【解决方案1】:

看起来这是 $compile:tpload 错误(至少有很大一部分)的原因,如果不是其他一些错误的话:

https://github.com/angular/angular.js/issues/14219

基本上,Chrome 和 Firefox 似乎错误地(?)为 XHR 请求生成错误事件,这些请求由于卸载页面(即重新加载或导航离开)而中止。在我的情况下,客户端必须有正在处理的角度模板请求,这些模板在重新加载或导航离开时会被中止......也许他们的网络连接速度很慢并且在加载页面时遇到问题,因此尝试重新加载。

我通过将 PHP sleep() 请求插入其中一个模板来重现错误,以防止 Apache 立即响应。如果我加载页面,然后重新加载或导航离开,则会相应地记录 $compile:tpload 错误。我还发现 Apache 只会在访问日志文件中记录请求一旦得到响应,这至少可以在某种程度上解释我在那里观察到的行为(尽管不完全!)

它并没有解释 IE11 发生的错误事件 - 我无法用它来重现它。它也没有解释为什么绝大多数事件都发生在 Android 设备上。

总之,取得了一些进展,但我还没有所有的答案。至少这对外面的人来说可能是半有用的!

【讨论】:

    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2018-05-22
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 2020-01-25
    相关资源
    最近更新 更多