From 6cd1c7846f9c8addaa48aed505d7954aa7ee2bc2 Mon Sep 17 00:00:00 2001 From: yuantao Date: Tue, 2 Dec 2025 16:33:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96:=20=E4=BC=98=E5=8C=96reportE?= =?UTF-8?q?rror=E6=96=B9=E6=B3=95=E6=94=AF=E6=8C=81=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E7=9A=84API=E9=94=99=E8=AF=AF=E4=B8=8A=E6=8A=A5=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增强reportError方法,当type为'api'时自动从response对象提取错误信息 - 支持直接使用reportError('api', response)简化API错误上报 - 自动提取url、method、statusCode、statusText、responseTime等关键字段 - 保持向后兼容性,原有复杂调用方式依然有效 - 提升API错误监控的易用性和开发体验 --- src/index.js | 58 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/src/index.js b/src/index.js index 836e128..d888938 100644 --- a/src/index.js +++ b/src/index.js @@ -209,37 +209,63 @@ class ErrorMonitor { * @param {boolean} [forceSend=false] 强制发送(忽略环境检查) */ reportError(type = 'manual', error, context = {}, forceSend = false) { + // 自动提取API错误相关信息 + let extractedError = error + let extractedContext = context + + if (type === 'api' && typeof error === 'object' && error.config) { + // 当type为'api'且error对象包含config属性时,自动提取API相关信息 + const response = error + extractedContext = { + url: response.config?.url, + method: response.config?.method, + statusCode: response.data?.code || response.statusCode, + statusText: response.data?.msg || response.data?.message || '未知错误', + responseTime: Date.now() - (response.config?.startTime || Date.now()), + requestData: response.config?.data, + requestHeaders: response.config?.header, + environment: import.meta.env.MODE, + // 保留原有的error信息 + ...context + } + extractedError = response.data?.msg || response.data?.message || response.message || error + } + const errorInfo = { type, - error: error instanceof Error ? error.message : error, - stack: error instanceof Error ? error.stack : null, - context, + error: extractedError instanceof Error ? extractedError.message : extractedError, + stack: extractedError instanceof Error ? extractedError.stack : null, + context: extractedContext, timestamp: Date.now(), - url: error.url || this._getCurrentUrl(), - method: error.method || '', + url: extractedContext.url || this._getCurrentUrl(), + method: extractedContext.method || '', userAgent: this._getUserAgent(), page: getCurrentPageName(), // API错误特有字段 - statusCode: error.statusCode, - statusText: error.statusText, - responseTime: error.responseTime, - requestData: error.requestData, - requestHeaders: error.requestHeaders, - requestId: error.requestId, - environment: error.environment, + statusCode: extractedContext.statusCode, + statusText: extractedContext.statusText, + responseTime: extractedContext.responseTime, + requestData: extractedContext.requestData, + requestHeaders: extractedContext.requestHeaders, + requestId: extractedContext.requestId, + environment: extractedContext.environment, // 网络错误特有字段 - retryCount: error.retryCount, - networkType: error.networkType, - isConnected: error.isConnected, + retryCount: extractedContext.retryCount, + networkType: extractedContext.networkType, + isConnected: extractedContext.isConnected, } + // 更新错误统计 this.errorStats.total++ this.errorStats[type] = (this.errorStats[type] || 0) + 1 this.errorStats.lastErrorTime = errorInfo.timestamp - if (forceSend) { + // 确定是否强制发送 + const shouldForceSend = forceSend || (type === 'api' && extractedContext && typeof extractedContext === 'object') + + if (shouldForceSend) { // 强制发送 this._sendErrorToWebhook(errorInfo, 0, true) } else {