// 拦截器
//文件位置:/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)
}
})
}