Files
dvcp_v2_webapp/ui/lib/js/observer.js
2023-02-13 10:55:56 +08:00

69 lines
1.8 KiB
JavaScript

import http from "./request"
/**
* 观察者工具对象,用于前端接口监测
*/
class Observer {
constructor() {
this.initXHRObserver()
}
static saveLog(item = {}) {
const api = {
method: item.method,
path: item.url,
url: location.href,
nodeProcess: process.env.NODE_ENV,
status: item.response?.code || item.status,
code: item.response?.code,
error: item.response?.code != 0 ? item.response?.data : null,
device: navigator.userAgent
}
if (!/(sockjs-node|hot-update|monitorApi|frontjs|apiForward)/.test(api.path)) {
if (!!this.timer) {
clearTimeout(this.timer)
}
this.pending = [this.pending, api].flat().filter(Boolean)
this.timer = setTimeout(() => {
http.post("/admin/apiForward", this.pending, {
withoutToken: true,
params: {url: "http://dvcp.cunwuyun.cn/ns/node/monitorApi/addOrUpdate"}
}).then(res => {
if (res?.code == 0) {
this.pending = []
}
}).catch(() => this.cancelOB = true)
}, 5000)
}
}
initXHRObserver() {
const origin = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function (...args) {
let send = this.send;
let _this = this
let post_data = []
this.send = function (...data) {
post_data = data;
return send.apply(_this, data)
}
this.addEventListener("readystatechange", function () {
if (this.readyState === 4) {
// 请求后拦截
!this.cancelOB && Observer.saveLog({
url: args[1],
status: this.status,
method: args[0],
data: post_data,
response: JSON.parse(this.response || null)
})
}
}, false)
return origin.apply(this, args)
}
}
}
export default Observer