Nuxt封装axios为plugin

目录

https://blog.meowrain.cn/api/i/2025/01/22/EgZzWA1737531565796108720.avif

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
import type {
  AxiosInstance,
  AxiosResponse,
  InternalAxiosRequestConfig,
} from "axios";
import axios from "axios";

declare module "#app" {
  interface NuxtApp {
    $axios: AxiosInstance;
  }
}
const handleRequestHeader = (config: InternalAxiosRequestConfig<any>) => {
  const token = localStorage.getItem("token");
  config.headers["Authorization"] = token;
  console.log("jwtToken获取成功: ", token);
};
const handleResponse = (response: AxiosResponse) => {};
const handleNetworkError = (errStatus: number): string => {
  // HTTP 错误码参考 https://blog.meowrain.cn/api/i/2025/01/22/bTJO3P1737530752562639385.avif
  let errMessage: string = "";
  if (errStatus) {
    switch (errStatus) {
      case 400:
        errMessage = "错误的请求";
        break;
      case 401:
        errMessage = "未授权,请重新登录";
        break;
      case 403:
        errMessage = "拒绝访问";
        break;
      case 404:
        errMessage = "请求错误,未找到该资源";
        break;
      case 405:
        errMessage = "请求方法未允许";
        break;
      case 408:
        errMessage = "请求超时";
        break;
      case 500:
        errMessage = "服务器错误";
        break;
      case 501:
        errMessage = "网络未实现";
        break;
      case 502:
        errMessage = "网络错误";
        break;
      case 503:
        errMessage = "服务不可用";
        break;
      case 504:
        errMessage = "网络超时";
        break;
      case 505:
        errMessage = "http版本不支持该请求";
        break;
      default:
        errMessage = `其他连接错误 --${errStatus}`;
    }
  } else {
    errMessage = "无法连接到服务器!";
  }
  return errMessage;
};
export default defineNuxtPlugin((nuxtApp) => {
  //获取运行时配置
  const app = useAppConfig();
  const axiosInstance: AxiosInstance = axios.create({
    baseURL: app.Api.baseUrl,
    timeout: app.Api.timeout,
  });
  axiosInstance.interceptors.request.use(
    (config: InternalAxiosRequestConfig<any>) => {
      handleRequestHeader(config);
      return config;
    }
  );
  axiosInstance.interceptors.response.use(
    (response: AxiosResponse) => {
      //对响应数据做处理
      return response.data;
    },
    (error: any) => {
      let errMessage: string = "";
      //处理响应错误
      if (error.response) {
        errMessage = handleNetworkError(error.response.status);
        console.error(errMessage);
      } else if (error.request) {
        errMessage = handleNetworkError(0); //无法连接到服务器
        // 请求已经发出,但是没有收到响应
      }
      return Promise.reject(new Error(errMessage));
    }
  );
  return {
    provide: {
      axios: axiosInstance,
    },
  };
});

使用

https://blog.meowrain.cn/api/i/2025/01/22/7bi7Mn1737531696824397207.avif

const { $axios } = useNuxtApp(); // 获取 $axios 实例

const { getUserInfo } = useUserInfo();

然后就可以用$axios发送请求了

如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import type { LoginRequest, LoginResponse } from "~/types/login";
import type { ApiResponse } from "~/types/api-response";
import { useNuxtApp } from "#app";
import { useUserInfo } from "../user/info";
import type { GetUserInfoRequest } from "~/types/user_info";

export const useAuthLogin = () => {
  const authStore = useAuthStore(); // 获取 authStore
  const notification = useNotification(); // 获取 notification
  const login = async (data: LoginRequest): Promise<boolean> => {
    const { $axios } = useNuxtApp(); // 获取 $axios 实例
    const { getUserInfo } = useUserInfo();
    try {
      // 发送登录请求
      const response: ApiResponse<LoginResponse> = await $axios.post(
        "/user/login",
        data,
        {
          headers: {
            "Content-Type": "application/json",
          },
        }
      );

      // 检查响应数据
      if (response.data == null) {
        console.error("token为空");
        notification.showError("登录失败,请重试");
        return false;
      }

      // 保存 token 和更新登录状态
      authStore.saveJwtToken(response.data);
      authStore.updateLoggedStatus(true);
      notification.showSuccess("登录成功");
      //登录后获取用户信息
      const request: GetUserInfoRequest = {};
      const isUserInfoFetched = await getUserInfo(request);
      if (!isUserInfoFetched) {
        notification.showError("用户信息获取失败");
        return false;
      }
      return true;
    } catch (err) {
      console.error("登录时遇到错误:", err);
      notification.showError("登录失败,请检查用户名和密码");
      return false;
    }
  };

  return {
    login,
  };
};
0%