http.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /**
  2. * 添加拦截器:
  3. * 拦截 request 请求
  4. * TODO:
  5. * 1. 非 http 开头需拼接地址
  6. * 2. 请求超时
  7. * 3. 添加小程序端请求头标识
  8. * 4. 添加 token 请求头标识
  9. */
  10. // import { useInfoStore } from "@/stores";
  11. // import { loadEnv } from "vite";
  12. // const env: Record<string, string> = loadEnv();
  13. const baseURL = import.meta.env.VITE_API_URL; //process.env.VITE_API_URL;
  14. console.log("--------------------------", import.meta.env.VITE_API_URL);
  15. // const baseURL = import.meta.env.MODE === 'production' ? import.meta.env.VITE_API_URL + '/prod-api' : import.meta.env.VITE_API_URL
  16. // const baseURL = import.meta.env.VITE_API_URL + '/prod-api'
  17. // 添加拦截器
  18. const httpInterceptor = {
  19. // 拦截前触发
  20. invoke(options: UniApp.RequestOptions) {
  21. // 1. 非 http 开头需拼接地址
  22. if (!options.url.startsWith("http")) {
  23. options.url = baseURL + options.url;
  24. }
  25. // 2. 请求超时, 默认 60s
  26. options.timeout = 30000;
  27. // 3. 添加小程序端请求头标识
  28. options.header = {
  29. ...options.header,
  30. "source-client": "miniapp",
  31. };
  32. // 4. 添加 token 请求头标识
  33. // const InfoStore = useInfoStore();
  34. // const token = InfoStore?.token;
  35. // if (token) {
  36. // options.header.Authorization = token;
  37. // }
  38. },
  39. };
  40. uni.addInterceptor("request", httpInterceptor);
  41. /**
  42. * 请求函数
  43. * @param UniApp.RequestOptions
  44. * @returns Promise
  45. * 1. 返回 Promise 对象
  46. * 2. 获取数据成功
  47. * 2.1 提取核心数据 res.data
  48. * 3. 获取数据失败
  49. * 3.1 401错误 -> 清理用户信息,跳转到登录页
  50. * 3.2 其他错误 -> 根据后端错误信息轻提示
  51. * 3.3 网络错误 -> 提示用户换网络
  52. */
  53. // 2.2 添加类型,支持泛型
  54. export const http = (options: UniApp.RequestOptions) => {
  55. // 1. 返回 Promise 对象
  56. return new Promise((resolve, reject) => {
  57. uni.request({
  58. ...options,
  59. // 响应成功
  60. success(res: any) {
  61. // 状态码 2xx, axios 就是这样设计的
  62. if (res.statusCode >= 200 && res.statusCode < 300) {
  63. if (res.data.code == 401) {
  64. // 401错误 -> 清理用户信息,跳转到登录页
  65. // const InfoStore = useInfoStore();
  66. // InfoStore.clearToken();
  67. uni.redirectTo({ url: "/" });
  68. } else {
  69. // 2.1 提取核心数据 res.data
  70. resolve(res.data);
  71. }
  72. } else if (res.statusCode === 401) {
  73. // 401错误 -> 清理用户信息,跳转到登录页
  74. // const InfoStore = useInfoStore();
  75. // InfoStore.clearToken();
  76. uni.redirectTo({ url: "/" });
  77. reject(res);
  78. } else {
  79. // 其他错误 -> 根据后端错误信息轻提示
  80. uni.showToast({
  81. icon: "none",
  82. title: res.data.msg || "请求错误",
  83. });
  84. reject(res);
  85. }
  86. },
  87. // 响应失败
  88. fail(err) {
  89. uni.showToast({
  90. icon: "none",
  91. title: "网络错误,换个网络试试",
  92. });
  93. reject(err);
  94. },
  95. });
  96. });
  97. };