查看原文
其他

【第314期】用window.onerror捕获并上报Js错误

baidufe 前端早读课 2019-06-17

来自早读君:

昨天是理论构想型,今天继续深化这部分所遇到的坑,只介绍采用window.onerro来收集报错信息。

正文从这开始~

从W3C找到关于window.onerror的方法体介绍:


这个意思,基本可以就是说,window.onerror方法,我们可以写成:


不过使用过程中还得注意兼容性问题,不是所有浏览器都有参数列表中的所有参数,chrome之类的,都是浏览器标准草案的领跑者,这些个参数用就是了!

于是,可以写一个小Demo来尝试一下:


其中error.js文件中的内容,简单的这样写一句:


用浏览器跑起来以后,打开console,基本就是这样的了:


所以,这些数据都是可以做上报的了。

当然了,上面的error.js是和html页面同域名下,如果error.js不在同域下,会是怎样的?我们把error.js的引用改一下:


再来打开console,我们看到的是这样的:


相当于window.onerror方法只捕获到了一个errorMessage,而且是固定字符串,毫无参考价值。查了点资料(Webkit源码),发现在浏览器实现script资源加载的地方,是进行了同源策略判断的,如果是非同源资源,errorMessage就被写死为“Script error”了:


好在script标签有一个crossorigin属性,设置它可以显示比较详细的错误信息,我们试着将script标签改一下:


刷新页面,这个时候看到console中的输出是这样的:


出现这个error也不意外,既然设置了error.js为crossorigin,那error.js的HTTP Response Header也必须设置非同源可访问。为了方便设置Header,把error.js做一个小改动,更名为:error-js.php。


此时刷新页面,看到console中的输出就已经正常了,所有信息都能正常捕获:


总结:

静态资源是放到静态域(非同源)下的,所以要想通过window.onerror捕获错误信息,就得按照上面的最后一种情况来操作了:

1、添加script的crossorigin属性

2、配置一下服务器,设置静态资源Javascript的Response为Access-Control-Allow-Origin

这里有几个点需要注意,一个是日志收集接口暴露在外,最好增加安全措施,比如设置token。

另外,脚本部署的时机、位置,以及日志过滤等条件,也需要根据具体情况进行设定。

onerror的事件绑定

如果想用事件绑定的方法处理window.onerror,有一点需要特别注意:


来自早读君:

这种事情在公司是可以操作的,动手起来,解放自己~


长按图片识别图中二维码



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存