/** * 添加拦截器: * 拦截 request 请求 * TODO: * 1. 非 http 开头需拼接地址 * 2. 请求超时 * 3. 添加小程序端请求头标识 * 4. 添加 token 请求头标识 */ // import { useInfoStore } from "@/stores"; // import { loadEnv } from "vite"; // const env: Record = loadEnv(); const baseURL = import.meta.env.VITE_API_URL; //process.env.VITE_API_URL; console.log("--------------------------", import.meta.env.VITE_API_URL); // const baseURL = import.meta.env.MODE === 'production' ? import.meta.env.VITE_API_URL + '/prod-api' : import.meta.env.VITE_API_URL // const baseURL = import.meta.env.VITE_API_URL + '/prod-api' // 添加拦截器 const httpInterceptor = { // 拦截前触发 invoke(options: UniApp.RequestOptions) { // 1. 非 http 开头需拼接地址 if (!options.url.startsWith("http")) { options.url = baseURL + options.url; } // 2. 请求超时, 默认 60s options.timeout = 30000; // 3. 添加小程序端请求头标识 options.header = { ...options.header, "source-client": "miniapp", }; // 4. 添加 token 请求头标识 // const InfoStore = useInfoStore(); // const token = InfoStore?.token; // if (token) { // options.header.Authorization = token; // } }, }; uni.addInterceptor("request", httpInterceptor); /** * 请求函数 * @param UniApp.RequestOptions * @returns Promise * 1. 返回 Promise 对象 * 2. 获取数据成功 * 2.1 提取核心数据 res.data * 3. 获取数据失败 * 3.1 401错误 -> 清理用户信息,跳转到登录页 * 3.2 其他错误 -> 根据后端错误信息轻提示 * 3.3 网络错误 -> 提示用户换网络 */ // 2.2 添加类型,支持泛型 export const http = (options: UniApp.RequestOptions) => { // 1. 返回 Promise 对象 return new Promise((resolve, reject) => { uni.request({ ...options, // 响应成功 success(res: any) { // 状态码 2xx, axios 就是这样设计的 if (res.statusCode >= 200 && res.statusCode < 300) { if (res.data.code == 401) { // 401错误 -> 清理用户信息,跳转到登录页 // const InfoStore = useInfoStore(); // InfoStore.clearToken(); uni.redirectTo({ url: "/" }); } else { // 2.1 提取核心数据 res.data resolve(res.data); } } else if (res.statusCode === 401) { // 401错误 -> 清理用户信息,跳转到登录页 // const InfoStore = useInfoStore(); // InfoStore.clearToken(); uni.redirectTo({ url: "/" }); reject(res); } else { // 其他错误 -> 根据后端错误信息轻提示 uni.showToast({ icon: "none", title: res.data.msg || "请求错误", }); reject(res); } }, // 响应失败 fail(err) { uni.showToast({ icon: "none", title: "网络错误,换个网络试试", }); reject(err); }, }); }); };