Files
workspace/code/allapp/allapp-rn/src/request/index.ts
T
2026-02-01 22:33:01 +08:00

114 lines
2.9 KiB
TypeScript

import type { Method } from 'alova'
import type { AxiosError } from 'axios'
import { axiosRequestAdapter } from '@alova/adapter-axios'
import { createAlova } from 'alova'
import { useNavStore } from '@/store/navigation'
import { useUserStore } from '@/store/user'
import { toast } from '@/utils/toast'
enum HttpCode {
Success = 200,
Unauthorized = 401,
Fail = 500,
}
// 仅保留「无需登录」接口
const WhiteList = [
'/auth/login/**',
]
function isWhiteListed(url: string) {
return WhiteList.some((pattern) => {
if (pattern.endsWith('/**')) {
const base = pattern.slice(0, -3)
return url.startsWith(base)
}
return url === pattern
})
}
const alovaInstance = createAlova({
baseURL: 'http://192.168.5.6:8086/app',
// baseURL: 'http://192.168.1.137:8086/app',
requestAdapter: axiosRequestAdapter(),
timeout: 5000,
cacheFor: null,
responded: {
onSuccess: async (response, method: Method) => {
const resData = response.data as ResponseData<any>
const result = {
...resData,
isSuccess: resData.code === HttpCode.Success,
}
if (resData.code === HttpCode.Unauthorized) {
useUserStore.getState().clear()
useNavStore.getState().navigateToAuth()
return Promise.reject(new Error('登录已失效'))
}
return result
},
onError: (error: AxiosError) => {
const status = error.status
const config = error.config
console.warn(`[HTTP ${status}] ${config?.method?.toUpperCase()} ${config?.url}`)
switch (status) {
case 400:
toast.show({ title: '请求错误,请检查输入参数' })
break
case 401:
toast.show({ title: '未授权,请重新登录' })
break
case 403:
toast.show({ title: '没有权限访问该资源' })
break
case 404:
toast.show({ title: '请求丢失啦,请稍后再试!' })
break
case 500:
toast.show({ title: '服务器出错啦,请稍后重试' })
break
case 502:
toast.show({ title: '网关错误,请稍后重试' })
break
case 503:
toast.show({ title: '服务暂不可用,请稍后再试' })
break
case 504:
toast.show({ title: '网关超时,请稍后再试' })
break
default:
toast.show({ title: '服务器出错啦,请稍后重试' })
break
}
return Promise.reject(error)
},
},
beforeRequest(method) {
// 白名单接口直接放行
if (isWhiteListed(method.url))
return
const userStore = useUserStore.getState()
// 未登录直接拦截
if (!userStore.isLoggedIn()) {
useNavStore.getState().navigateToAuth()
return Promise.reject(new Error('未登录'))
}
// 注入 JWT
method.config.headers.Token = userStore.userInfo!.token
},
})
export default alovaInstance