| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- import type { Method } from 'alova'
- // Custom error class for API errors
- export class ApiError extends Error {
- code: number
- data?: any
- constructor(message: string, code: number, data?: any) {
- super(message)
- this.name = 'ApiError'
- this.code = code
- this.data = data
- }
- }
- // Define a type for the expected API response structure
- interface ApiResponse {
- code: number
- msg?: string
- data?: any
- success?: boolean
- total?: number
- more?: boolean
- }
- // Handle successful responses
- export async function handleAlovaResponse(
- response: UniApp.RequestSuccessCallbackResult | UniApp.UploadFileSuccessCallbackResult | UniApp.DownloadSuccessData,
- ) {
- const globalToast = useGlobalToast()
- // Extract status code and data from UniApp response
- const { statusCode, data } = response as UniNamespace.RequestSuccessCallbackResult
- // 处理401/403错误(如果不是在handleAlovaResponse中处理的)
- if ((statusCode === 401 || statusCode === 403)) {
- const { redirectName } = storeToRefs(useUserStore())
- useSmqjhCartStore().$reset()
- // 如果是未授权错误,清除用户信息并跳转到登录页
- useUserStore().$reset()
- redirectName.value = getCurrentPath()
- // useGlobalMessage().confirm({
- // title: '提示',
- // msg: '登录已过期,请重新登录!',
- // success: () => {
- // router.replace({ name: 'smqjh-login' })
- // },
- // })
- throw new ApiError('登录已过期,请重新登录!', statusCode, data)
- }
- // Handle HTTP error status codes
- if (statusCode >= 400) {
- const datas = data as ApiResponse
- globalToast.error(datas.msg as string)
- throw new ApiError(`Request failed with status: ${statusCode}`, statusCode, data)
- }
- // The data is already parsed by UniApp adapter
- const json = data as ApiResponse
- // Log response in development
- if (import.meta.env.MODE === 'development') {
- console.log('[Alova Response]', json)
- }
- // Return data for successful responses
- if (typeof json == 'string') {
- return JSON.parse(json).data
- }
- return json
- }
- // Handle request errors
- export function handleAlovaError(error: any, method: Method) {
- const globalToast = useGlobalToast()
- // Log error in development
- if (import.meta.env.MODE === 'development') {
- console.error('[Alova Error]', error, method)
- }
- // 处理401/403错误(如果不是在handleAlovaResponse中处理的)
- if (error instanceof ApiError && (error.code === 401 || error.code === 403)) {
- // 如果是未授权错误,清除用户信息并跳转到登录页
- const { redirectName } = storeToRefs(useUserStore())
- useSmqjhCartStore().$reset()
- // 如果是未授权错误,清除用户信息并跳转到登录页
- useUserStore().$reset()
- redirectName.value = getCurrentPath()
- // useGlobalMessage().confirm({
- // title: '提示',
- // msg: '登录已过期,请重新登录!',
- // success: () => {
- // router.replace({ name: 'smqjh-login' })
- // },
- // })
- throw new ApiError('登录已过期,请重新登录!', error.code, error.data)
- }
- // Handle different types of errors
- if (error.name === 'NetworkError') {
- globalToast.error('网络错误,请检查您的网络连接')
- }
- else if (error.name === 'TimeoutError') {
- globalToast.error('请求超时,请重试')
- }
- else if (error instanceof ApiError) {
- globalToast.error(error.message || '请求失败')
- }
- else {
- globalToast.error('网络异常!请联系客服')
- }
- throw error
- }
|