try {
var a = 1;
var b = a + c;
}
catch (e) {
console.log(e);
}
window.onerror = function(errorMessage, scriptURI, lineNo, columnNo, error) {
console.log('errorMessage: ' + errorMessage);
console.log('scriptURI: ' + scriptURI);
console.log('lineNo: ' + lineNo);
console.log('columnNo: ' + columnNo);
console.log('error: ' + error);
};
console.log(a);
<script>
window.onerror = function() {
console.log(arguments);
};
</script>
<script src="http://cdn.xxx.com/index.js"></script>
`<script src="http://cdn.xxx.com/index.js" crossorigin="anonymous"></script>`
var path = require('path');
module.exports = {
mode: 'development',
entry: './client/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'client')
}
}
`!function(e){var o={};function n(r){if(o[r])return o[r].exports;var t=o[r]={i:r,l:!1,exports:{}}...;`
module.exports = { ...
devtool: '#source-map',
...
}
`!function(e){var o={};function n(r){if(o[r])return o[r].exports;var t=o[r]={i:r,l:!1,exports:{}}...;`
`version: 3, sources: ["webpack:///webpack/bootstrap", ...], names: ["installedModules", "__webpack_require__", ...], mappings: "aACA,IAAAA,KAGA,SAAAC...", file: "bundle.js", sourcesContent: ["// The module cache var installedModules = {};..."], sourceRoot: ""`
Vue.config.errorHandler = function(err, vm, info) {
let {
message,
name,
script,
line,
column,
stack
} = err;
}
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = {
hasError: false
};
}
componentDidCatch(error, info) {
this.setState({
hasError: true
});
logErrorToMyService(error, info);
}
render() {
if (this.state.hasError) {
return '出错了';
}
return this.props.children;
}
}
<ErrorBoundary> <MyWidget />
</ErrorBoundary>
2. sourceMap解析window.onerror = function(errorMessage, scriptURI, lineNo, columnNo, error) {
var errorObj = {
errorMessage: errorMessage || null,
scriptURI: scriptURI || null,
lineNo: lineNo || null,
columnNo: columnNo || null,
stack: error && error.stack ? error.stack : null
};
if (XMLHttpRequest) {
var xhr = new XMLHttpRequest();
xhr.open('post', '/middleware/errorMsg', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify(errorObj));
}
}
const express = require('express');
const fs = require('fs');
const router = express.Router();
const fetch = require('node-fetch');
const sourceMap = require('source-map');
const path = require('path');
const resolve = file => path.resolve(__dirname, file);
router.post('/errorMsg/', function(req, res) {
let error = req.body;
let url = error.scriptURI;
if (url) {
let fileUrl = url.slice(url.indexOf('client/')) + '.map';
let smc = new sourceMap.SourceMapConsumer(fs.readFileSync(resolve('../' + fileUrl), 'utf8'));
smc.then(function(result) {
let ret = result.originalPositionFor({
line: error.lineNo,
column: error.columnNo
});
let url = '';
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
errorMessage: error.errorMessage,
source: ret.source,
line: ret.line,
column: ret.column,
stack: error.stack
})
}).then(function(response) {
return response.json();
}).then(function(json) {
res.json(json);
});
})
}
});
module.exports = router;
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |