xuexiaole-mobile/src/api/request/interceptor.ts
2025-08-02 22:18:17 +08:00

97 lines
2.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* eslint-disable prefer-promise-reject-errors */
import type { RequestOptions, ResponseData, ErrorResponse } from './types'
import { HTTP_STATUS, ERROR_MSG } from './config'
import router from '@/router/router'
import db from '@/utils/db'
import toast from '@/utils/hud'
// 请求拦截器
export const requestInterceptor = async (options: RequestOptions): Promise<RequestOptions> => {
// 设置请求头
const header: any = {
...options?.header,
}
// 获取token
const token = db.get('token')
// 如果有token添加到请求头
if (token) {
header['Authorization'] = `Bearer ${token}`
}
return {
...options,
header,
}
}
// 响应拦截器
export const responseInterceptor = async <T>(
response: ResponseData<T>,
): Promise<ResponseData<T>> => {
const { statusCode, data } = response as any
console.log('response', response)
// 处理成功响应
if (statusCode === HTTP_STATUS.SUCCESS && data.code === 200) {
return response
} else {
throw {
statusCode,
errMsg: data.message || '网络问题,请稍后再试',
}
}
}
// 错误拦截器
export const errorInterceptor = (error: any): Promise<ErrorResponse> => {
let message
const { statusCode, errMsg } = error
let toLogin = false
if (statusCode === HTTP_STATUS.SUCCESS) {
message = errMsg
} else {
// 处理特定状态码
switch (statusCode) {
case HTTP_STATUS.AUTHENTICATE:
toLogin = true
message = ERROR_MSG.AUTH_ERROR
break
case HTTP_STATUS.FORBIDDEN:
toLogin = true
message = ERROR_MSG.FORBIDDEN_ERROR
break
case HTTP_STATUS.NOT_FOUND:
message = ERROR_MSG.NOT_FOUND_ERROR
break
case HTTP_STATUS.SERVER_ERROR:
case HTTP_STATUS.BAD_GATEWAY:
case HTTP_STATUS.SERVICE_UNAVAILABLE:
case HTTP_STATUS.GATEWAY_TIMEOUT:
message = ERROR_MSG.SERVER_ERROR
break
default:
message = ERROR_MSG.DEFAULT_ERROR
break
}
}
// 显示错误提示
if (message) {
toast.error(message)
if (toLogin) {
router.toLogin()
}
}
return Promise.reject({
code: -1,
message,
data: error,
})
}