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