Files
rustfs-console/composables/useErrorHandler.ts
T
overtrue 0598f8065f refactor: 修复 API 客户端 composables 滥用和硬编码路径问题
- 修复 lib/api-client.ts 中在类方法中直接调用 composables 的问题
- 添加 ApiErrorHandler 错误处理器,通过依赖注入方式处理 401 错误
- 创建路由工具函数 utils/routes.ts,统一管理路由路径
- 修复 composables/useAuth.ts 中的硬编码路径,使用工具函数
- 修复 components/copy-input.vue 的生命周期问题,在 onMounted 中创建 ClipboardJS 实例
- 修复 plugins/03.s3.ts 中的错误处理,使用 navigateTo 替代直接操作 window.location
- 修复 pages/config.vue 中的硬编码路径
- 添加 composables/useFormValidation.ts、useAsyncOperation.ts、useErrorHandler.ts 工具函数(供后续使用)
- 添加 types/api.ts 类型定义
2025-10-31 22:50:59 +08:00

107 lines
2.5 KiB
TypeScript

/**
* 统一的错误处理 Composable
* 提供一致的错误处理和消息显示
*/
import { useMessage } from '~/lib/ui/message';
import { useI18n } from 'vue-i18n';
export interface ErrorHandlerOptions {
/**
* 是否记录错误到控制台
* @default true
*/
logError?: boolean;
/**
* 默认错误消息的翻译键
* @default 'Operation failed'
*/
defaultMessageKey?: string;
}
/**
* 错误处理工具
* @param options 配置选项
* @returns 错误处理函数
*/
export function useErrorHandler(options: ErrorHandlerOptions = {}) {
const { logError = true, defaultMessageKey = 'Operation failed' } = options;
const message = useMessage();
const { t } = useI18n();
/**
* 处理错误
* @param error 错误对象
* @param defaultMessage 默认错误消息(可选)
*/
const handleError = (error: unknown, defaultMessage?: string): void => {
let errorMessage = defaultMessage || t(defaultMessageKey);
// 提取错误消息
if (error instanceof Error) {
errorMessage = error.message || errorMessage;
} else if (typeof error === 'string') {
errorMessage = error;
} else if (error && typeof error === 'object' && 'message' in error) {
errorMessage = String(error.message);
}
// 记录错误
if (logError) {
console.error('[ErrorHandler]', error);
}
// 显示错误消息
message.error(errorMessage);
};
/**
* 处理 API 错误
* @param error 错误对象
* @param defaultMessage 默认错误消息
*/
const handleApiError = (
error: unknown,
defaultMessage?: string
): void => {
// API 错误可能有特定的格式
if (
error &&
typeof error === 'object' &&
'response' in error &&
'data' in error
) {
const apiError = error as { response?: { data?: { message?: string } } };
const apiMessage =
apiError.response?.data?.message ||
defaultMessage ||
t('API request failed');
handleError(apiMessage);
return;
}
handleError(error, defaultMessage);
};
/**
* 静默处理错误(不显示消息)
* @param error 错误对象
* @returns 错误消息
*/
const handleErrorSilently = (error: unknown): string => {
if (error instanceof Error) {
return error.message;
}
if (typeof error === 'string') {
return error;
}
return t(defaultMessageKey);
};
return {
handleError,
handleApiError,
handleErrorSilently,
};
}