优化: 优化reportError方法支持简化的API错误上报方式

- 增强reportError方法,当type为'api'时自动从response对象提取错误信息
- 支持直接使用reportError('api', response)简化API错误上报
- 自动提取url、method、statusCode、statusText、responseTime等关键字段
- 保持向后兼容性,原有复杂调用方式依然有效
- 提升API错误监控的易用性和开发体验
This commit is contained in:
yuantao
2025-12-02 16:33:56 +08:00
parent 0e1264d083
commit 6cd1c7846f

View File

@@ -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 {