vue3 ts axios請求封裝,取消請求,失敗重發(fā),權(quán)限控制問題
vue3 ts axios請求封裝,取消請求,失敗重發(fā),權(quán)限控制
用了 TypeScript 進(jìn)行全面支持
針對前后端交互常見問題進(jìn)行了細(xì)致的處理,包括將 token 添加至請求頭、增加超時(shí)請求重試、添加請求取消功能等等。
此外,該工具還提供了統(tǒng)一的異常處理機(jī)制,對于常見的網(wǎng)絡(luò)連接不穩(wěn)定、請求超時(shí)等異常情況,能夠快速準(zhǔn)確地進(jìn)行處理。
使用該工具
可以提高代碼質(zhì)量和可維護(hù)性
import axios, { AxiosRequestConfig, CancelTokenSource } from 'axios'
import { ElMessage } from 'element-plus';
//用于報(bào)錯
import config from "@/config/projectOptions"
//項(xiàng)目整體配置
import router from "@/router";
//權(quán)限跳轉(zhuǎn)
interface AxiosRequestConfigExtended extends AxiosRequestConfig {
retry: number
retryDelay: number
}
axios.defaults.baseURL = config.baseUrl//url
const timeout = 5000//超時(shí)時(shí)間
let timer: number//用于延時(shí)重發(fā)請求
const request = axios.create({
timeout,
retry: 0, // 重試次數(shù)
retryDelay: timeout // 重試間隔
} as AxiosRequestConfigExtended);
request.interceptors.request.use(config => {
config.headers && (config.headers.token = sessionStorage.getItem('token') || "")//填寫token
timer = window.setTimeout(() => {
config.cancelToken = axios.CancelToken.source().token//用于取消請求
}, timeout)
return config
// 對響應(yīng)數(shù)據(jù)做點(diǎn)什么
}, function (error) {
clearTimeout(timer)//錯誤后清除延時(shí)
// 對響應(yīng)錯誤做點(diǎn)什么
throw error
});
request.interceptors.response.use(res => {
if (res.status === 200 && res.data.ok) {//狀態(tài)判斷
return res.data//正常返回
} else {
errorHandle({ response: res })//異常集中處理
return Promise.reject({ message: 'Unknown response format' });//報(bào)錯提示格式錯誤
}
// 對響應(yīng)數(shù)據(jù)做點(diǎn)什么
}, async function (error) {
// 對響應(yīng)錯誤做點(diǎn)什么
if (!error.config || !error.config.retry || error.response.data) {
return errorHandle(error)
}
error.config.retry -= 1//記錄請求
await new Promise((resolve) => {
setTimeout(() => {
resolve("");
}, error.config.retryDelay);
})
//等待請求重發(fā)
return request(error.config)
});
// 錯誤處理
function errorHandle(error: any) {
let message = ""
//報(bào)錯處理
if (error.response.data) { //格式判斷
if ([401, 403].indexOf(error.response.status) > -1) {
// 對于未授權(quán)或權(quán)限不夠的錯誤,直接跳轉(zhuǎn)到登錄頁面
message = '登錄過期,請重新登錄'
setTimeout(() => {
sessionStorage.clear()
router.replace({ path: "Login" })
}, 1000)
} else if (error.response.data.code) {
if ([522, 523].indexOf(error.response.data.code) > -1) {
// 對于未授權(quán)或權(quán)限不夠的錯誤,直接跳轉(zhuǎn)到登錄頁面
message = error.response.data.message
setTimeout(() => {
sessionStorage.clear()
router.replace({ path: "Login" })
}, 1000)
} else {
message = message = error.response.data.message
}
} else if (error.message === "Network Error") {
message = "網(wǎng)絡(luò)連接已斷開,請檢查網(wǎng)絡(luò)"
} else if (error.message === `timeout of ${timeout}ms exceeded`) {
message = "請求超時(shí),請檢查網(wǎng)絡(luò)"
} else if (error.message.indexOf('timeout') > -1) {
message = "服務(wù)器響應(yīng)超時(shí),請重試"
} else {
message = error.message
}
} else {
message = "請求失敗,請稍后重試"
}
ElMessage.error(message)
return Promise.reject(error);
}
export default {
//導(dǎo)出get方法 傳入cancel用于取消請求
get: (url: string, params?: any, cancel?: CancelTokenSource) => request.get(url, {
params,
cancelToken: cancel ? cancel.token : undefined
}),
//用于post傳入數(shù)據(jù)識別params||body
post: (url: string, data?: { params?: any, data?: any }, cancel?: CancelTokenSource) => request.post(url, data?.data, {
params: data?.params,
cancelToken: cancel ? cancel.token : undefined
}),
//導(dǎo)出刪除
delete: (url: string, params?: any, cancel?: CancelTokenSource) => request.delete(url, {
params,
cancelToken: cancel ? cancel.token : undefined
})
//可自行增加
}
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue實(shí)現(xiàn)導(dǎo)航欄效果(選中狀態(tài)刷新不消失)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)導(dǎo)航欄效果,選中狀態(tài)刷新不消失,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
vue靜態(tài)界面之左二級菜單右表單表格的實(shí)例代碼
這篇文章主要介紹了vue靜態(tài)界面之左二級菜單右表單表格,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
在Vue項(xiàng)目中修改啟動后的Logo和項(xiàng)目名稱的方法
在Vue項(xiàng)目開發(fā)中,我們經(jīng)常需要根據(jù)項(xiàng)目需求修改默認(rèn)的品牌標(biāo)識,無論是企業(yè)級管理系統(tǒng)還是個人項(xiàng)目,定制化的Logo和名稱都能讓項(xiàng)目更具辨識度,本文將詳細(xì)介紹如何在Vue項(xiàng)目中修改啟動后的Logo和項(xiàng)目名稱,需要的朋友可以參考下2026-03-03
Nginx同一端口部署多個前后端分離的vue項(xiàng)目完整步驟
最近做項(xiàng)目結(jié)構(gòu)優(yōu)化,前端項(xiàng)目都是部署在nginx上,想實(shí)現(xiàn)同一個端口可以訪問多個前端項(xiàng)目,所以就有了本文,這篇文章主要給大家介紹了關(guān)于Nginx同一端口部署多個前后端分離的vue項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2023-10-10
webpack+vue+express(hot)熱啟動調(diào)試簡單配置方法
今天小編就為大家分享一篇webpack+vue + express (hot) 熱啟動調(diào)試簡單配置方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09
vue-cli3項(xiàng)目在IE瀏覽器打開兼容問題及解決
這篇文章主要介紹了vue-cli3項(xiàng)目在IE瀏覽器打開兼容問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
詳解VUE 定義全局變量的幾種實(shí)現(xiàn)方式
本篇文章主要介紹了VUE 全局變量的幾種實(shí)現(xiàn)方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06

