automated_uniapp/cool/service/request.ts

133 lines
2.5 KiB
TypeScript
Raw Normal View History

2025-01-09 16:16:11 +08:00
import { useStore } from "../store";
import { router } from "../router";
import { isDev, config } from "../../config";
import { storage } from "../utils";
// 请求队列
let requests: any[] = [];
// Token 是否刷新中
let isRefreshing = false;
export default function request(options: any) {
// 缓存信息
const { user } = useStore();
// 标识
let Authorization = user.token || "";
// 忽略标识
config.ignore.token.forEach((e) => {
if (options.url.includes(e)) {
Authorization = "";
}
});
if (isDev) {
console.log(`[${options.method || "GET"}] ${options.url}`);
}
return new Promise(async (resolve, reject) => {
// 继续请求
function next() {
uni.request({
...options,
header: {
Authorization,
...options.header,
},
success(res) {
const { code, data, message } = res.data as {
code: number;
message: string;
data: any;
};
// 无权限
if (res.statusCode === 401) {
if (router.info()?.path == router.pages.login) {
return reject({ message });
} else {
user.logout();
}
}
// 服务异常
if (res.statusCode === 502) {
return reject({
message: "服务异常",
});
}
// 未找到
if (res.statusCode === 404) {
return reject({
message: `[404] ${options.url}`,
});
}
// 成功
if (res.statusCode === 200) {
switch (code) {
case 1000:
resolve(data);
break;
default:
reject({ message, code });
}
} else {
reject({ message: "服务异常" });
}
},
fail(err) {
reject({ message: err.errMsg });
},
});
}
// 刷新token处理
if (!options.url.includes("refreshToken")) {
if (Authorization) {
// 判断 token 是否过期
if (storage.isExpired("token")) {
// 判断 refreshToken 是否过期
if (storage.isExpired("refreshToken")) {
// 退出登录
return user.logout();
}
// 是否在刷新中
if (!isRefreshing) {
isRefreshing = true;
user.refreshToken()
.then((token) => {
requests.forEach((cb) => cb(token));
requests = [];
isRefreshing = false;
})
.catch((err) => {
user.logout();
reject(err);
});
}
return new Promise((resolve) => {
// 继续请求
requests.push((token: string) => {
// 重新设置 token
Authorization = token;
next();
resolve();
});
});
}
}
}
next();
});
}