mirror of
http://git.coreshop.cn/jianweie/coreshoppro.git
synced 2025-12-06 17:23:26 +08:00
新增【token】: jwt token 过期,根据接口返回401状态,静默用户登录获取新的token
This commit is contained in:
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user