UNPKG

infly-libs

Version:

工具组件库

90 lines (78 loc) 2.85 kB
import axios from "axios"; import Uts from "./Uts.js"; const baseURL = process.env.VUE_APP_BASE_API; const { env } = Uts.getEnv() || {}; const isTestEnv = Uts.contain(["localhost", "infly-test"], env); const isProdAPI = Uts.contain(["https://api.sutpay.com"], baseURL); /** * 创建封装的 axios 实例 * @param {Object} config 配置项 * @param {Function|String} config.getToken 获取 token 的函数或值 * @param {Function} config.onLogout 登出回调 * @param {Function} config.onNotify 通知回调 * @returns {AxiosInstance} */ export function createService({ getToken, onLogout, onNotify }) { const service = axios.create({ baseURL }); /** * 获取 token 字符串 */ const resolveToken = () => { return Uts.isFunction(getToken) ? getToken() : getToken; }; /** * 发送通知 */ const handleNotify = ({ message, type = "error", duration = 5000 }) => { if (Uts.isFunction(onNotify)) { onNotify({ message, type, duration }); } else { console.warn("[Notify]", message); } }; service.interceptors.request.use( (config) => { const Token = resolveToken(); if (Token) { config.headers["Authorization"] = " JWT " + Token; } if (isTestEnv && isProdAPI) { handleNotify({ message: `当前环境为测试环境,接口请求为正式环境接口,请暂停操作,检查构建文件`, type: "error", duration: 10 * 1000, }); } return config; }, (error) => { return Promise.reject(error); } ); service.interceptors.response.use( (response) => response.data, (error) => { const errorInfo = error.response; if (errorInfo) { if ([401, 403].includes(errorInfo.status)) { handleNotify({ message: `登录信息已过期(${errorInfo.status}), 请重新登录!`, type: "error", }); if (Uts.isFunction(onLogout)) { onLogout("user/logout").then(() => { location.href = "/login"; }); } } else if (errorInfo.status === 500) { handleNotify({ message: `服务器异常(${errorInfo.status}),请联系开发人员`, type: "error", }); } } return Promise.reject(error); } ); return service; }