mirror of
http://git.coreshop.cn/jianweie/coreshoppro.git
synced 2026-02-05 05:19:49 +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 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 {
|
|
||||||
/** 储存当前请求 */
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return UniP.request<T>({
|
|
||||||
url: url.indexOf('http') >= 0 ? url : `${getRequestHost()}/${url}`,
|
url: url.indexOf('http') >= 0 ? url : `${getRequestHost()}/${url}`,
|
||||||
method,
|
method,
|
||||||
data,
|
data,
|
||||||
header: {
|
header: {
|
||||||
...requestHeader
|
...header,
|
||||||
|
'Authorization': `Bearer ${uni.getStorageSync(UserToken)}`
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (callBack) {
|
||||||
|
return callBack(res);
|
||||||
|
}
|
||||||
|
// 授权过期
|
||||||
|
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