handlers.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import type { Method } from 'alova'
  2. // Custom error class for API errors
  3. export class ApiError extends Error {
  4. code: number
  5. data?: any
  6. constructor(message: string, code: number, data?: any) {
  7. super(message)
  8. this.name = 'ApiError'
  9. this.code = code
  10. this.data = data
  11. }
  12. }
  13. // Define a type for the expected API response structure
  14. interface ApiResponse {
  15. code: number
  16. msg?: string
  17. data?: any
  18. success?: boolean
  19. total?: number
  20. more?: boolean
  21. }
  22. // Handle successful responses
  23. export async function handleAlovaResponse(
  24. response: UniApp.RequestSuccessCallbackResult | UniApp.UploadFileSuccessCallbackResult | UniApp.DownloadSuccessData,
  25. ) {
  26. const globalToast = useGlobalToast()
  27. // Extract status code and data from UniApp response
  28. const { statusCode, data } = response as UniNamespace.RequestSuccessCallbackResult
  29. // 处理401/403错误(如果不是在handleAlovaResponse中处理的)
  30. if ((statusCode === 401 || statusCode === 403)) {
  31. const { redirectName } = storeToRefs(useUserStore())
  32. useSmqjhCartStore().$reset()
  33. // 如果是未授权错误,清除用户信息并跳转到登录页
  34. useUserStore().$reset()
  35. redirectName.value = getCurrentPath()
  36. // useGlobalMessage().confirm({
  37. // title: '提示',
  38. // msg: '登录已过期,请重新登录!',
  39. // success: () => {
  40. // router.replace({ name: 'smqjh-login' })
  41. // },
  42. // })
  43. throw new ApiError('登录已过期,请重新登录!', statusCode, data)
  44. }
  45. // Handle HTTP error status codes
  46. if (statusCode >= 400) {
  47. const datas = data as ApiResponse
  48. globalToast.error(datas.msg as string)
  49. throw new ApiError(`Request failed with status: ${statusCode}`, statusCode, data)
  50. }
  51. // The data is already parsed by UniApp adapter
  52. const json = data as ApiResponse
  53. // Log response in development
  54. if (import.meta.env.MODE === 'development') {
  55. console.log('[Alova Response]', json)
  56. }
  57. // Return data for successful responses
  58. if (typeof json == 'string') {
  59. return JSON.parse(json).data
  60. }
  61. return json
  62. }
  63. // Handle request errors
  64. export function handleAlovaError(error: any, method: Method) {
  65. const globalToast = useGlobalToast()
  66. // Log error in development
  67. if (import.meta.env.MODE === 'development') {
  68. console.error('[Alova Error]', error, method)
  69. }
  70. // 处理401/403错误(如果不是在handleAlovaResponse中处理的)
  71. if (error instanceof ApiError && (error.code === 401 || error.code === 403)) {
  72. // 如果是未授权错误,清除用户信息并跳转到登录页
  73. const { redirectName } = storeToRefs(useUserStore())
  74. useSmqjhCartStore().$reset()
  75. // 如果是未授权错误,清除用户信息并跳转到登录页
  76. useUserStore().$reset()
  77. redirectName.value = getCurrentPath()
  78. // useGlobalMessage().confirm({
  79. // title: '提示',
  80. // msg: '登录已过期,请重新登录!',
  81. // success: () => {
  82. // router.replace({ name: 'smqjh-login' })
  83. // },
  84. // })
  85. throw new ApiError('登录已过期,请重新登录!', error.code, error.data)
  86. }
  87. // Handle different types of errors
  88. if (error.name === 'NetworkError') {
  89. globalToast.error('网络错误,请检查您的网络连接')
  90. }
  91. else if (error.name === 'TimeoutError') {
  92. globalToast.error('请求超时,请重试')
  93. }
  94. else if (error instanceof ApiError) {
  95. globalToast.error(error.message || '请求失败')
  96. }
  97. else {
  98. globalToast.error('网络异常!请联系客服')
  99. }
  100. throw error
  101. }