bmfe-monitor
Version:
前端监测平台
95 lines (86 loc) • 2.6 kB
JavaScript
import xhr from './xhr'
import Report from './report';
let report = new Report()
// 这里只处理资源错误
window.addEventListener('error',function(e, scriptURI, lineNumber, columnNumber, errorObj){
debugger
var typeName = e.target.localName;
var sourceUrl = "";
if (typeName === "link") {
sourceUrl = e.target.href;
} else if (typeName === "script" || typeName === "img") {
sourceUrl = e.target.src;
} else {
// 说明不是资源错误
return
}
let path = e.path || (e.composedPath && e.composedPath());
let obj = {
type: 'resourceError',
tagName: e.target.tagName,
outerHTML: e.target.outerHTML,
sourceUrl,
// XPath: path
}
var o = new XMLHttpRequest;
o.open("HEAD", sourceUrl)
o.send()
o.onload = function (e) {
if(200 !== e.target.status) {
obj.status = e.target.status,
obj.statusText = e.target.statusText
report.send(obj)
}
}
}, true);
// 监听promise错误,但是兼容性不好,Firefox和IE旧版本不支持
window.addEventListener("unhandledrejection", function(e){
debugger
let reason = e.reason;
// 如果错误信息中包含msg和resCode字段,可以认为是接口错误,不处理
if(reason.msg || reason.resCode) return
report.send({
type: e.type || 'unhandledrejection',
reason
})
});
window.onerror = function(e) {
debugger
}
let formatError = (errObj) => {
let col = errObj.column || errObj.columnNumber; // Safari Firefox
let row = errObj.line || errObj.lineNumber; // Safari Firefox
let message = errObj.message;
let stackCol = null;
let stackRow = null;
let { stack } = errObj;
if (stack) {
let matchUrl = stack.match(/https?:\/\/[^\n]+/);
let urlFirstStack = matchUrl ? matchUrl[0] : '';
let posStack = urlFirstStack.match(/:(\d+):(\d+)/);
if (posStack && posStack.length >= 3) {
[, stackRow, stackCol] = posStack;
}
}
// TODO formatStack
return {
type: 'caught',
col: Number(col || stackCol),
row: Number(row || stackRow),
message: message
}
};
const init = (vue,config) => {
report.init(config)
vue.config.errorHandler = function (err, vm, info) {
let errObj = formatError(err)
report.send(errObj)
}
// 请求都被promise包裹,怎么区分,学习fundebug的做法
xhr.init((xhrInfo) => {
report.send(xhrInfo)
});
}
export default {
init
}