首页 > 语言 > JavaScript > 正文

Vue中axios的封装(报错、鉴权、跳转、拦截、提示)

2024-05-06 15:35:44
字体:
来源:转载
供稿:网友
统一捕获接口报错 弹窗提示 报错重定向 基础鉴权 表单序列化

实现的功能

统一捕获接口报错 : 用的axios内置的拦截器 弹窗提示: 引入 Element UI 的 Message 组件 报错重定向: 路由钩子 基础鉴权: 服务端过期时间戳和token,还有借助路由的钩子 表单序列化: 我这边直接用 qs (npm模块),你有时间也可以自己写

用法及封装

用法

// 服务层 , import默认会找该目录下index.js的文件,这个可能有小伙伴不知道// 可以去了解npm的引入和es6引入的理论概念import axiosPlugin from "./server"; Vue.use(axiosPlugin);对axios的封装(AXIOS: index.js )import axios from "axios";import qs from "qs";import { Message } from "element-ui";import router from "../router";const Axios = axios.create({ baseURL: "/", // 因为我本地做了反向代理 timeout: 10000, responseType: "json", withCredentials: true, // 是否允许带cookie这些 headers: {  "Content-Type": "application/x-www-form-urlencoded;charset=utf-8" }});//POST传参序列化(添加请求拦截器)Axios.interceptors.request.use( config => {  // 在发送请求之前做某件事  if (   config.method === "post"  ) {   // 序列化   config.data = qs.stringify(config.data);   // 温馨提示,若是贵公司的提交能直接接受json 格式,可以不用 qs 来序列化的  }  // 若是有做鉴权token , 就给头部带上token  // 若是需要跨站点,存放到 cookie 会好一点,限制也没那么多,有些浏览环境限制了 localstorage 的使用  // 这里localStorage一般是请求成功后我们自行写入到本地的,因为你放在vuex刷新就没了  // 一些必要的数据写入本地,优先从本地读取  if (localStorage.token) {   config.headers.Authorization = localStorage.token;  }  return config; }, error => {  // error 的回调信息,看贵公司的定义  Message({   // 饿了么的消息弹窗组件,类似toast   showClose: true,   message: error && error.data.error.message,   type: 'error'  });  return Promise.reject(error.data.error.message); });//返回状态判断(添加响应拦截器)Axios.interceptors.response.use( res => {  //对响应数据做些事  if (res.data && !res.data.success) {   Message({    // 饿了么的消息弹窗组件,类似toast    showClose: true,    message: res.data.error.message.message     ? res.data.error.message.message     : res.data.error.message,    type: "error"   });   return Promise.reject(res.data.error.message);  }  return res; }, error => {  // 用户登录的时候会拿到一个基础信息,比如用户名,token,过期时间戳  // 直接丢localStorage或者sessionStorage  if (!window.localStorage.getItem("loginUserBaseInfo")) {   // 若是接口访问的时候没有发现有鉴权的基础信息,直接返回登录页   router.push({    path: "/login"   });  } else {   // 若是有基础信息的情况下,判断时间戳和当前的时间,若是当前的时间大于服务器过期的时间   // 乖乖的返回去登录页重新登录   let lifeTime =    JSON.parse(window.localStorage.getItem("loginUserBaseInfo")).lifeTime *    1000;   let nowTime = new Date().getTime(); // 当前时间的时间戳   console.log(nowTime, lifeTime);   console.log(nowTime > lifeTime);   if (nowTime > lifeTime) {    Message({     showClose: true,     message: "登录状态信息过期,请重新登录",     type: "error"    });    router.push({     path: "/login"    });   } else {    // 下面是接口回调的satus ,因为我做了一些错误页面,所以都会指向对应的报错页面    if (error.response.status === 403) {     router.push({      path: "/error/403"     });    }    if (error.response.status === 500) {     router.push({      path: "/error/500"     });    }    if (error.response.status === 502) {     router.push({      path: "/error/502"     });    }    if (error.response.status === 404) {     router.push({      path: "/error/404"     });    }   }  }  // 返回 response 里的错误信息  let errorInfo = error.data.error ? error.data.error.message : error.data;  return Promise.reject(errorInfo); });// 对axios的实例重新封装成一个plugin ,方便 Vue.use(xxxx)export default { install: function(Vue, Option) {  Object.defineProperty(Vue.prototype, "$http", { value: Axios }); }};            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选