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] 强制发送(忽略环境检查)
|
* @param {boolean} [forceSend=false] 强制发送(忽略环境检查)
|
||||||
*/
|
*/
|
||||||
reportError(type = 'manual', error, context = {}, 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 = {
|
const errorInfo = {
|
||||||
type,
|
type,
|
||||||
error: error instanceof Error ? error.message : error,
|
error: extractedError instanceof Error ? extractedError.message : extractedError,
|
||||||
stack: error instanceof Error ? error.stack : null,
|
stack: extractedError instanceof Error ? extractedError.stack : null,
|
||||||
context,
|
context: extractedContext,
|
||||||
timestamp: Date.now(),
|
timestamp: Date.now(),
|
||||||
url: error.url || this._getCurrentUrl(),
|
url: extractedContext.url || this._getCurrentUrl(),
|
||||||
method: error.method || '',
|
method: extractedContext.method || '',
|
||||||
userAgent: this._getUserAgent(),
|
userAgent: this._getUserAgent(),
|
||||||
page: getCurrentPageName(),
|
page: getCurrentPageName(),
|
||||||
|
|
||||||
// API错误特有字段
|
// API错误特有字段
|
||||||
statusCode: error.statusCode,
|
statusCode: extractedContext.statusCode,
|
||||||
statusText: error.statusText,
|
statusText: extractedContext.statusText,
|
||||||
responseTime: error.responseTime,
|
responseTime: extractedContext.responseTime,
|
||||||
requestData: error.requestData,
|
requestData: extractedContext.requestData,
|
||||||
requestHeaders: error.requestHeaders,
|
requestHeaders: extractedContext.requestHeaders,
|
||||||
requestId: error.requestId,
|
requestId: extractedContext.requestId,
|
||||||
environment: error.environment,
|
environment: extractedContext.environment,
|
||||||
|
|
||||||
// 网络错误特有字段
|
// 网络错误特有字段
|
||||||
retryCount: error.retryCount,
|
retryCount: extractedContext.retryCount,
|
||||||
networkType: error.networkType,
|
networkType: extractedContext.networkType,
|
||||||
isConnected: error.isConnected,
|
isConnected: extractedContext.isConnected,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 更新错误统计
|
||||||
this.errorStats.total++
|
this.errorStats.total++
|
||||||
this.errorStats[type] = (this.errorStats[type] || 0) + 1
|
this.errorStats[type] = (this.errorStats[type] || 0) + 1
|
||||||
this.errorStats.lastErrorTime = errorInfo.timestamp
|
this.errorStats.lastErrorTime = errorInfo.timestamp
|
||||||
|
|
||||||
if (forceSend) {
|
// 确定是否强制发送
|
||||||
|
const shouldForceSend = forceSend || (type === 'api' && extractedContext && typeof extractedContext === 'object')
|
||||||
|
|
||||||
|
if (shouldForceSend) {
|
||||||
// 强制发送
|
// 强制发送
|
||||||
this._sendErrorToWebhook(errorInfo, 0, true)
|
this._sendErrorToWebhook(errorInfo, 0, true)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user