refactor Network
This commit is contained in:
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
"module": "./dist/timi-web.mjs",
|
"module": "./dist/timi-web.mjs",
|
||||||
"style": "./dist/timi-web.css",
|
"style": "./dist/timi-web.css",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "0.0.21",
|
"version": "0.0.22",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
+2
-2
@@ -1,2 +1,2 @@
|
|||||||
export * from "./device";
|
export * from "./deviceStore";
|
||||||
export * from "./user";
|
export * from "./userStore";
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@ export type Model = {
|
|||||||
deletedAt?: number;
|
deletedAt?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Response<T> = {
|
export type ApiResponse<T> = {
|
||||||
code: number;
|
code: number;
|
||||||
msg?: string;
|
msg?: string;
|
||||||
data: T;
|
data: T;
|
||||||
|
|||||||
+79
-35
@@ -1,48 +1,69 @@
|
|||||||
import axios, { InternalAxiosRequestConfig } from "axios";
|
import axios, {type AxiosInstance, type AxiosResponse, type InternalAxiosRequestConfig} from "axios";
|
||||||
import Cooker from "./Cooker";
|
import {ApiResponse} from "../types";
|
||||||
import type { Response } from "../types/Model";
|
|
||||||
import Time from "./Time";
|
|
||||||
import { userStore } from "../store/user";
|
|
||||||
|
|
||||||
type ErrorCallback = (response: Response<any>) => void;
|
export type ErrorCallback = (response: ApiResponse<any>) => void;
|
||||||
|
export type RequestInterceptor = (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig;
|
||||||
|
export interface ResponseObserverPayload {
|
||||||
|
config?: InternalAxiosRequestConfig;
|
||||||
|
status?: number;
|
||||||
|
response?: AxiosResponse;
|
||||||
|
error?: any;
|
||||||
|
serverResponse?: ApiResponse<any>;
|
||||||
|
}
|
||||||
|
export type ResponseObserver = (payload: ResponseObserverPayload) => void;
|
||||||
|
|
||||||
let globalErrorCallback: ErrorCallback | null = null;
|
let globalErrorCallback: ErrorCallback | null = null;
|
||||||
|
let globalRequestInterceptor: RequestInterceptor | null = null;
|
||||||
|
let globalResponseObserver: ResponseObserver | null = null;
|
||||||
|
|
||||||
export const setGlobalErrorCallback = (callback: ErrorCallback) => {
|
export const setGlobalErrorCallback = (callback: ErrorCallback) => {
|
||||||
globalErrorCallback = callback;
|
globalErrorCallback = callback;
|
||||||
};
|
};
|
||||||
|
|
||||||
const userTokenInterceptors = async (config: InternalAxiosRequestConfig<any>) => {
|
export const setGlobalRequestInterceptor = (callback: RequestInterceptor | null) => {
|
||||||
let token = userStore.loginUser.token?.value;
|
globalRequestInterceptor = callback;
|
||||||
const cookieToken = Cooker.get("Token");
|
};
|
||||||
if (token && token === cookieToken) {
|
|
||||||
config.headers.set({"Token": token});
|
export const setGlobalResponseObserver = (callback: ResponseObserver | null) => {
|
||||||
} else {
|
globalResponseObserver = callback;
|
||||||
if (cookieToken) {
|
};
|
||||||
token = cookieToken;
|
|
||||||
userStore.loginUser.token = {
|
const notifyResponseObserver = (payload: ResponseObserverPayload) => {
|
||||||
value: token,
|
if (!globalResponseObserver) {
|
||||||
expireAt: Time.now() + Time.D
|
return;
|
||||||
};
|
|
||||||
}
|
|
||||||
if (token) {
|
|
||||||
await userStore.login4Token({
|
|
||||||
value: token,
|
|
||||||
expireAt: Time.now() + Time.D
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
globalResponseObserver(payload);
|
||||||
|
};
|
||||||
|
|
||||||
|
const applyDefaultInterceptors = (instance: AxiosInstance) => {
|
||||||
|
instance.defaults.withCredentials = true;
|
||||||
|
instance.interceptors.request.use((config) => {
|
||||||
|
if (globalRequestInterceptor) {
|
||||||
|
return globalRequestInterceptor(config);
|
||||||
}
|
}
|
||||||
return config;
|
return config;
|
||||||
};
|
});
|
||||||
axios.defaults.withCredentials = true;
|
instance.interceptors.response.use((axiosResp: any) => {
|
||||||
axios.interceptors.response.use((axiosResp: any) => {
|
|
||||||
if (!axiosResp.config.responseType) {
|
if (!axiosResp.config.responseType) {
|
||||||
// 服务端返回
|
// 服务端返回
|
||||||
const serverResp = axiosResp.data as Response<any>;
|
const serverResp = axiosResp.data as ApiResponse<any>;
|
||||||
if (serverResp.code < 40000) {
|
if (serverResp.code < 40000) {
|
||||||
|
notifyResponseObserver({
|
||||||
|
config: axiosResp?.config,
|
||||||
|
status: axiosResp?.status,
|
||||||
|
response: axiosResp,
|
||||||
|
serverResponse: serverResp
|
||||||
|
});
|
||||||
// 200 或 300 HTTP 状态段视为成功
|
// 200 或 300 HTTP 状态段视为成功
|
||||||
return serverResp.data;
|
return serverResp.data;
|
||||||
} else {
|
} else {
|
||||||
|
notifyResponseObserver({
|
||||||
|
config: axiosResp?.config,
|
||||||
|
status: axiosResp?.status,
|
||||||
|
response: axiosResp,
|
||||||
|
serverResponse: serverResp,
|
||||||
|
error: serverResp.msg
|
||||||
|
});
|
||||||
if (globalErrorCallback) {
|
if (globalErrorCallback) {
|
||||||
globalErrorCallback(serverResp);
|
globalErrorCallback(serverResp);
|
||||||
}
|
}
|
||||||
@@ -50,26 +71,49 @@ axios.interceptors.response.use((axiosResp: any) => {
|
|||||||
return Promise.reject(serverResp.msg);
|
return Promise.reject(serverResp.msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
notifyResponseObserver({
|
||||||
|
config: axiosResp?.config,
|
||||||
|
status: axiosResp?.status,
|
||||||
|
response: axiosResp
|
||||||
|
});
|
||||||
return axiosResp.data;
|
return axiosResp.data;
|
||||||
}, (error: any) => {
|
}, (error: any) => {
|
||||||
|
notifyResponseObserver({
|
||||||
|
config: error?.config,
|
||||||
|
status: error?.response?.status,
|
||||||
|
response: error?.response,
|
||||||
|
error
|
||||||
|
});
|
||||||
// 请求错误
|
// 请求错误
|
||||||
if (error) {
|
if (error) {
|
||||||
if (error.response && error.response.status) {
|
if (error.response && error.response.status) {
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
if (error.request) {
|
if (error.request) {
|
||||||
if (error.message.startsWith("timeout")) {
|
if (error.message && error.message.startsWith("timeout")) {
|
||||||
throw new Error("time out");
|
throw new Error("time out");
|
||||||
} else {
|
} else {
|
||||||
throw new Error(error.message);
|
throw new Error(error.message || "request error");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw error;
|
throw error;
|
||||||
});
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const axiosInstance = axios.create();
|
||||||
|
applyDefaultInterceptors(axiosInstance);
|
||||||
|
|
||||||
|
export const createServiceAxios = (baseURL?: string) => {
|
||||||
|
const instance = axios.create({ baseURL });
|
||||||
|
applyDefaultInterceptors(instance);
|
||||||
|
return instance;
|
||||||
|
};
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
axios,
|
axios: axiosInstance,
|
||||||
userTokenInterceptors,
|
setGlobalErrorCallback,
|
||||||
setGlobalErrorCallback
|
setGlobalRequestInterceptor,
|
||||||
|
setGlobalResponseObserver,
|
||||||
|
createServiceAxios
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user