axios 封装,开封即用(ts版)

153 阅读1分钟
import axios, { AxiosRequestConfig } from "axios";

interface IRequestConfig extends AxiosRequestConfig {
  /* 是否触发loading态 */
  loading?: boolean;
}

export interface IResponseType<P = Record<string, unknown>> {
  code: string;
  message: string;
  data: P;
  success: boolean;
  pageNum?: number;
  pageSize?: number;
  totalPages?: number;
  totalCount?: number;
}

const instance = axios.create({
  baseURL: window._env_.baseURL,
  timeout: 8000,
  withCredentials: false,
  headers: {
    "X-GW-AccessKey": window._env_.accessKey,
  },
});

const ERROR_RESPONSE_DATA = (message = "") => {
  return {
    code: "-1",
    message,
    data: null as any,
    success: false,
  };
};

const request = async <T = Record<string, unknown>>(
  config: IRequestConfig
): Promise<IResponseType<T>> => {
  try {
    const { data } = await instance.request<IResponseType<T>>(config);
    if (data.code !== "0") {
      const message = `[${[data.code]}]\n ${data.message}`;
      ElMsgToast({
        message,
        type: "error",
        duration: 3000,
      });
      return ERROR_RESPONSE_DATA(message);
    }
    return data;
  } catch (error: any) {
    let message;
    let isShownToast = true;
    if (error.response) {
      const code = error.response?.status;
      const url =
        error.response?.request?.__currentUrl ?? error.response?.__currentUr;

      const errorCodeSourceMap: Record<number, string> = {
        400: `接口参数错误!\n${url}`,
        401: `接口尚未授权,请联系企业管理员!\n${url}`,
        404: `接口未找到!\n${url}`,
        418: `用户Token失效\n${url}`,
        502: `服务器正在启动,请耐心等待!\n${url}`,
      };
      message = errorCodeSourceMap[code] ?? `连接错误: ${error.message}`;
      isShownToast = code !== 417;
    } else {
      if (error.message === "Network Error")
        message = "网络异常,请检查后重试!";

      message = "连接到服务器失败,请联系管理员!";
    }
    isShownToast &&
      Message({
        message,
        type: "error",
        duration: 3000,
      });

    return ERROR_RESPONSE_DATA(message);
  }
};

export default request;