0


若依ruoyi-vue前端异常处理

/utils/request.js

文件是基于 axios 的封装,用于统一处理请求参数、请求头、错误提示信息等。这些功能的封装使得在 Ruoyi Vue 中进行 HTTP 请求时可以更加方便和统一,同时也提高了代码的可维护性和可扩展性。下面是对这些功能的具体描述:

  1. 全局 request 拦截器:在请求发送前会执行的拦截器,可以在这里统一设置请求头部信息等。
// request拦截器
service.interceptors.request.use(config=>{// 是否需要设置 tokenconst isToken =(config.headers ||{}).isToken ===false// 是否需要防止数据重复提交const isRepeatSubmit =(config.headers ||{}).repeatSubmit ===falseif(getToken()&&!isToken){
    config.headers['Authorization']='Bearer '+getToken()// 让每个请求携带自定义token 请根据实际情况自行修改}// get请求映射params参数if(config.method ==='get'&& config.params){let url = config.url +'?'+tansParams(config.params);
    url = url.slice(0,-1);
    config.params ={};
    config.url = url;}if(!isRepeatSubmit &&(config.method ==='post'|| config.method ==='put')){const requestObj ={url: config.url,data:typeof config.data ==='object'?JSON.stringify(config.data): config.data,time:newDate().getTime()}const requestSize = Object.keys(JSON.stringify(requestObj)).length;// 请求数据大小const limitSize =5*1024*1024;// 限制存放数据5Mif(requestSize >= limitSize){
      console.warn(`[${config.url}]: `+'请求数据大小超出允许的5M限制,无法进行防重复提交验证。')return config;}const sessionObj = cache.session.getJSON('sessionObj')if(sessionObj ===undefined|| sessionObj ===null|| sessionObj ===''){
      cache.session.setJSON('sessionObj', requestObj)}else{const s_url = sessionObj.url;// 请求地址const s_data = sessionObj.data;// 请求数据const s_time = sessionObj.time;// 请求时间const interval =1000;// 间隔时间(ms),小于此时间视为重复提交if(s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url){const message ='数据正在处理,请勿重复提交';
        console.warn(`[${s_url}]: `+ message)return Promise.reject(newError(message))}else{
        cache.session.setJSON('sessionObj', requestObj)}}}return config
},error=>{
    console.log(error)
    Promise.reject(error)})
  1. 全局 response 拦截器:在接收到响应后会执行的拦截器,可以在这里统一处理响应数据,比如对错误进行统一处理。
// 响应拦截器
service.interceptors.response.use(res=>{// 未设置状态码则默认成功状态const code = res.data.code ||200;// 获取错误信息const msg = errorCode[code]|| res.data.msg || errorCode['default']// 二进制数据则直接返回if(res.request.responseType ==='blob'|| res.request.responseType ==='arraybuffer'){return res.data
    }if(code ===401){if(!isRelogin.show){
        isRelogin.show =true;
        MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录','系统提示',{confirmButtonText:'重新登录',cancelButtonText:'取消',type:'warning'}).then(()=>{
          isRelogin.show =false;
          store.dispatch('LogOut').then(()=>{const currentUrl = window.location.href
            location.href = currentUrl.substring(currentUrl.indexOf("/"))})}).catch(()=>{
        isRelogin.show =false;});}return Promise.reject('无效的会话,或者会话已过期,请重新登录。')}elseif(code ===500){Message({message: msg,type:'error'})return Promise.reject(newError(msg))}elseif(code ===601){Message({message: msg,type:'warning'})return Promise.reject('error')}elseif(code !==200){
      Notification.error({title: msg })return Promise.reject('error')}else{return res.data
    }},error=>{
    console.log('err'+ error)let{ message }= error;if(message =="Network Error"){
      message ="后端接口连接异常";}elseif(message.includes("timeout")){
      message ="系统接口请求超时";}elseif(message.includes("Request failed with status code")){
      message ="系统接口"+ message.substr(message.length -3)+"异常";}Message({message: message,type:'error',duration:5*1000})return Promise.reject(error)})
  1. 统一的错误处理:通过 response 拦截器统一处理错误响应,可以根据错误码在 errorCode.js 中设置对应的错误信息,并进行统一的错误提示或者其他处理。
exportdefault{'401':'认证失败,无法访问系统资源','403':'当前操作没有权限','404':'访问资源不存在','default':'系统未知错误,请反馈给管理员'}
  1. 超时处理:通过 axios 的配置项可以设置请求超时时间,在超时后可以进行相应的处理。
// 创建axios实例const service = axios.create({// axios中请求配置有baseURL选项,表示请求URL公共部分baseURL: process.env.VUE_APP_BASE_API,// 超时timeout:10000})
  1. baseURL 设置:可以在这里设置请求的基础 URL,方便统一管理接口地址。 在.env.development或者.env.production或者.env.staging文件里面可以设置:
# 若依管理系统/测试环境
VUE_APP_BASE_API='/stage-api'
标签: vue.js

本文转载自: https://blog.csdn.net/qq_27575627/article/details/138152782
版权归原作者 程序员诚哥 所有, 如有侵权,请联系我们删除。

“若依ruoyi-vue前端异常处理”的评论:

还没有评论