chat-app/src/service/index.js

92 lines
2.8 KiB
JavaScript
Raw Normal View History

2024-11-11 06:46:14 +00:00
import Request from '@/service/request/index.js'
import {useAuth} from "@/store/auth";
const { token ,refreshToken,userInfo}=useAuth()
let isRefreshing = false;
let refreshSubscribers = [];
const request = new Request({
baseURL: import.meta.env.VITE_BASEURL,
timeout: 1000 * 60 * 5,
interceptors: {
//实例的请求拦截器
requestInterceptors: (config) => {
config.headers['Content-Type'] = config.method === 'get' ?
'application/x-www-form-urlencoded' :
'application/json';
config.headers['Authorization'] = token.value
if (config.isFormData) {
config.headers['Content-Type'] = 'multipart/form-data';
}
return config;
},
//实例的响应拦截器
responseInterceptors: async (res) => {
if(res.data.status===1){
message.warning(res.data.msg)
}
if (res.data.status === 401) {
return getRefreshToken(res);
// uni.navigateTo({
// url:'/pages/login/index'
// })
}
if ([200, 201, 204].includes(res.status)) {
return res.config.responseType === 'blob' ? res : res;
} else {
/* message.error(res.data.msg || 'An error occurred.');*/
return Promise.reject(new Error(res.data.msg || 'An error occurred.'));
}
}
}
})
async function getRefreshToken(response) {
if (!isRefreshing) {
isRefreshing = true;
const refreshTokenT = refreshToken.value;
if (refreshTokenT) {
try {
const data = { refreshToken:refreshTokenT };
const res = await request.instance.post('/user/refresh/token', data);
if (res.code === 200) {
token.value = res.data.Token;
refreshToken.value = res.data.RefreshToken;
userInfo.value = res.data.AccountInfo
response.config.headers['Authorization'] = res.data.Token;
uni.navigateTo({
url:'/pages/index/index'
})
return request.request(response.config);
} else {
message.error(res.message || res.msg);
throw new Error(res.message || res.msg);
}
} catch (error) {
uni.navigateTo({
url:'/pages/login/index'
})
throw error
} finally {
isRefreshing = false;
refreshSubscribers.forEach(callback => callback());
refreshSubscribers = [];
}
} else {
uni.navigateTo({
url:'/pages/login/index'
})
throw new Error('No refresh token available.');
}
} else {
return new Promise(resolve => {
refreshSubscribers.push(() => resolve(request.request(response.config)));
});
}
}
const fontRequest = (config) => {
if (['get', 'GET'].includes(config.method)) {
config.params = config.data;
}
return request.request(config);
};
export default fontRequest;