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