NUXT3 $fetch request encapsulation interceptor

// 拦截器
//文件位置:/composables/useRequest.ts
import {ElMessage} from 'element-plus';

type Response = {
    url: string;
    body: any,
    status: number;
    type: string,
    statusText?: string;
    _data?: any;
    headers?: object,
    ok?: boolean,
    redirected?: boolean,
    bodyUsed?: boolean,
};
type ResponseData = {
    code: number,
    msg: string,
    data: object | object[]
}

export const useRequest = async (url: string, options: object) => {
    const router = useRouter();
    const metchArr = [
        `/admin/create`,
        `/admin/login`,
        `/user/login`,
        `/news/add`,
        `/news/delete`,
        `/sendEmail`,
        `/user/create/sendEmail`
    ]
    const ignore = metchArr.indexOf(url) !== -1;
    let headers;
    if (!ignore) {
        headers = {
            Authorization: 'Bearer ' + localStorage.getItem('token') || null,
        };
    } else {
        headers = {};
    }
    const defaultOptions: object = {
        //baseURL也可以在nuxt.config.ts中定义然后此处引入
        baseURL: "http://localhost:7001",
        headers: headers,
        //响应拦截
        onResponse({response}: { response: Response }) {
            console.log("response", response);
            const res = response._data;
            if (response.status == 200) {
                if (!res.success && res.code !== 20000) {
                    ElMessage.error(res.message || '请求失败');
                } else if (res.code && res.code !== 20000) {
                    // 根据返回的错误码显示不同的提示
                    switch (res.code) {
                        case 40000:
                            ElMessage.error(res.message || '请求失败');
                            break;
                        case 40001:
                            ElMessage.error(res.message || '邮箱验证码不一致');
                            break;
                        case 40002:
                            ElMessage.error(res.message || '两次密码输入不一致');
                            break;
                        case 40100:
                            ElMessage.warning(res.message || '未授权');
                            break;
                        case 40300:
                            ElMessage.warning(res.message || '禁止访问');
                            break;
                        case 40400:
                            ElMessage.warning(res.message || '未找到');
                            break;
                        case 50000:
                            ElMessage.error(res.message || '服务器错误');
                            break;
                        case 50001:
                            ElMessage.error(res.message || '数据库错误');
                            break;
                        case 50002:
                            ElMessage.error(res.message || 'Redis错误');
                            break;
                        case 40411:
                            ElMessage.error(res.message || '登录失败');
                            break;
                        default:
                            ElMessage.error('未知错误');
                    }
                }
            } else {
                ElMessage.error(res.message || '请求失败');
            }
            return response;
        },
        //响应错误拦截
        onResponseError({response}: { response: Response }) {
            console.log("response-error", response);
            const res = response._data;
        },
    };
    const newOptions: object = {...defaultOptions, ...options};
    //采用element-plus进行请求时的加载
    //const loadingInstance = ElLoading.service({fullscreen:false});
    const {data, pending, refresh} = await useFetch(url, newOptions);
    return {data, refresh};
};




// 使用
// 用户注册
export interface IEmailOptions {
    emailAddress: string;
}

export const SEND_EMAIL = (params: IEmailOptions) => {
    return new Promise(async (resolve, reject) => {
        try {
            const {data: response} = await useRequest('/nodeMaliler/sendEmail', {
                method: 'POST',
                body: params,
            })
            resolve(response)
        } catch (e) {
            reject(e)
        }
    })
}