EASYAIuniappNewUI/dist/dev/mp-weixin/utils/request.js
2025-02-16 11:40:12 +08:00

171 lines
5.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
const common_vendor = require("../common/vendor.js");
const composables_useCommon = require("../composables/useCommon.js");
const request = (apiUrl, options = {}, retry = true) => {
const fullUrl = apiUrl.startsWith("/") ? apiUrl : `/${apiUrl}`;
return new Promise((resolve, reject) => {
common_vendor.index.request({
url: `${getBaseURL()}${fullUrl}`,
header: {
Authorization: `Bearer ${getToken()}`
},
...options,
success: async (res) => {
if (res.statusCode === 401 && retry) {
const { token } = await refreshToken(getRefreshToken());
composables_useCommon.saveLoginInfo({ token });
console.log("刷新后获取的token", token);
if (token) {
options.header = {
Authorization: `Bearer ${token}`
};
request(apiUrl, options, false).then((res2) => {
resolve(res2);
}).catch((err) => {
reject(err);
});
} else {
reject(res);
}
} else {
if (res.data.data) {
resolve(res.data.data);
} else {
resolve(res.data);
}
}
},
fail: async (err) => {
console.log(233333333);
},
complete: async (err) => {
console.log("请求完成", err);
}
});
});
};
const refreshToken = async (refreshToken2, apiUrl = "/auth/refreshTokens", maxRetries = 3, retryInterval = 200, timeout = 5e3) => {
const apiPath = apiUrl.startsWith("/") ? apiUrl : `/${apiUrl}`;
let attempt = 0;
while (attempt < maxRetries) {
attempt++;
console.log(`尝试第 ${attempt} 次刷新Token, refreshToken:`, refreshToken2);
try {
return await new Promise((resolve, reject) => {
common_vendor.index.request({
url: `${getBaseURL()}${apiPath}`,
method: "POST",
headers: {
"Content-Type": "application/json"
},
data: { refreshToken: refreshToken2 },
timeout,
success: (res) => {
if (res.statusCode >= 400) {
console.log("refreshToken", res);
reject(res);
} else {
console.log("refreshToken", res);
resolve(res.data);
}
},
fail: (err) => {
console.error("刷新Token失败", err);
reject(err);
}
});
});
} catch (err) {
if (err.name === "AbortError") {
console.error(`${attempt} 次刷新Token超时`);
} else {
console.error(`${attempt} 次刷新Token失败`, err);
}
}
if (attempt < maxRetries) {
console.log(`等待 ${retryInterval} 毫秒后重试...`);
await new Promise((resolve) => setTimeout(resolve, retryInterval));
}
}
console.log("刷新Token失败已达到最大重试次数");
return null;
};
const uploadFile = (filePath, options = {}, apiUrl = "/file/upload") => {
const fullUrl = apiUrl.startsWith("/") ? apiUrl : `/${apiUrl}`;
return new Promise((resolve, reject) => {
common_vendor.index.uploadFile({
url: `${getBaseURL()}${fullUrl}`,
filePath,
name: "file",
header: {
Authorization: `Bearer ${getToken()}`
},
...options,
success: async (res) => {
if (res.statusCode === 401) {
const _refreshToken = getRefreshToken();
if (!_refreshToken) {
reject(res);
}
const { token } = await refreshToken(_refreshToken);
composables_useCommon.saveLoginInfo({ token });
console.log("刷新后获取的token", token);
if (token) {
options.header = {
Authorization: `Bearer ${token}`
};
uploadFile(filePath, options).then((res2) => {
resolve(res2);
}).catch((err) => {
reject(err);
});
} else {
reject(res);
}
} else {
console.log("success", res);
const data = JSON.parse(res.data);
if (data.data) {
resolve(data.data);
} else {
resolve(data);
}
}
},
fail: async (err) => {
console.log("fail", err);
if (err) {
const _refreshToken = getRefreshToken();
if (!_refreshToken) {
reject(err);
}
const { token } = await refreshToken(_refreshToken);
composables_useCommon.saveLoginInfo({ token });
console.log("刷新后获取的token", token);
if (token) {
options.header = {
Authorization: `Bearer ${token}`
};
uploadFile(filePath, options).then((res) => {
resolve(res);
}).catch((err2) => {
reject(err2);
});
} else {
reject(err);
}
} else {
reject(err);
}
}
});
});
};
const getBaseURL = () => "https://scschool.cc/api";
const getBaseWsURL = () => "wss://scschool.cc/websocket";
const getToken = () => composables_useCommon.getLoginInfo().token;
const getRefreshToken = () => composables_useCommon.getLoginInfo().refresh_token;
exports.getBaseWsURL = getBaseWsURL;
exports.request = request;
exports.uploadFile = uploadFile;