新增【token】: jwt token 过期,根据接口返回401状态,静默用户登录获取新的token

This commit is contained in:
21世纪小八路
2024-10-17 23:38:07 +08:00
parent db2cad6b90
commit 9c8493b881

View File

@@ -8,40 +8,50 @@ type TReqOptions = Pick<UniApp.RequestOptions, 'method' | 'data' | 'header'>;
type TReqMethodOptions = Omit<TReqOptions, 'method'>;
type TResData = UniApp.RequestSuccessCallbackResult['data'];
// 存储未完成的请求
const pendingRequests : any[] = [];
let isRefreshing = true;
let subscribers = [];
const request = async <T = TResData>(url : string, { method, data, header = {} } : TReqOptions, auth : boolean = true) : Promise<Response<T>> => {
function onAccessTokenFetched() {
subscribers.forEach((callback) => {
callback();
})
subscribers = [];
isRefreshing = true;
}
let requestHeader : any = header;
function addSubscriber(callback:Function) {
subscribers.push(callback)
}
if (auth) {
if (uni.getStorageSync(UserToken)) {
requestHeader['Authorization'] = `Bearer ${uni.getStorageSync(UserToken)}`;
} else {
/** 储存当前请求 */
pendingRequests.push({
url,
data: { method, data, header, },
auth,
});
/** 重新请求拿到token */
await handleLoginGetToken().then(() => {
pendingRequests.forEach((requestConfig) => {
return request(requestConfig.url, requestConfig.data, requestConfig.auth);
});
pendingRequests.length = 0;
});
return;
const request = async <T = TResData>(url : string, { method, data, header = {} } : TReqOptions, auth : boolean = true, callBack ?: Function) : Promise<Response<T>> => {
return new Promise(async (resolve, _) => {
const res = await UniP.request<T>({
url: url.indexOf('http') >= 0 ? url : `${getRequestHost()}/${url}`,
method,
data,
header: {
...header,
'Authorization': `Bearer ${uni.getStorageSync(UserToken)}`
}
});
if (callBack) {
return callBack(res);
}
}
return UniP.request<T>({
url: url.indexOf('http') >= 0 ? url : `${getRequestHost()}/${url}`,
method,
data,
header: {
...requestHeader
// 授权过期
if (res.code === 14007) {
addSubscriber(() => {
request<T>(url, { method, data, header }, auth, resolve)
});
if (isRefreshing) {
await handleLoginGetToken();
onAccessTokenFetched();
isRefreshing = true;
}
isRefreshing = false;
} else {
isRefreshing = true;
return resolve(res);
}
});
}