You've already forked uniapp-error-monitor
优化: 优化reportError方法支持简化的API错误上报方式
- 增强reportError方法,当type为'api'时自动从response对象提取错误信息
- 支持直接使用reportError('api', response)简化API错误上报
- 自动提取url、method、statusCode、statusText、responseTime等关键字段
- 保持向后兼容性,原有复杂调用方式依然有效
- 提升API错误监控的易用性和开发体验
This commit is contained in:
58
src/index.js
58
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 {
|
||||
|
||||
Reference in New Issue
Block a user