request.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import axios from "axios";
  2. import { ElMessage } from 'element-plus'
  3. // 创建一个axios实例
  4. const request = axios.create({
  5. baseURL: import.meta.env.VITE_APP_API_URL,
  6. timeout:20000, //请求超时时间 20秒
  7. })
  8. // 对于重复的post请求,只处理第一次请求,后续重复的请求在上一次返回之前都取消
  9. const postRequestList=new Set()
  10. // 需要储存每次请求对应的取消方法
  11. let lastGetRequestList=new Map()
  12. // 取消方法
  13. const removePreRequest=(Url,fun)=>{
  14. // console.log(lastGetRequestList);
  15. if(lastGetRequestList.has(Url)){
  16. // 取消上一次请求
  17. lastGetRequestList.get(Url)(`${Url}---重复请求被中断`)
  18. // 设置 新的取消方法
  19. lastGetRequestList.set(Url,fun)
  20. }
  21. }
  22. request.interceptors.request.use(
  23. config=>{
  24. config.headers['Authorization'] = localStorage.getItem('fsms_token') || ''
  25. // 不处理get请求
  26. if (config.method !== 'get') {
  27. // 利用axios cancelToken 先取消请求
  28. config.cancelToken = new axios.CancelToken(e => {
  29. // 在这里取消重复请求,上个请求未完成时,相同的请求不会再次执行
  30. postRequestList.has(config.url) ? e(`${config.url}---重复请求被中断`) : postRequestList.add(config.url)
  31. })
  32. }else if(config.params?.takeLastRequestResult){
  33. // 对于get请求中的参数有 takeLastRequestResult 且值为真 进行特殊处理,若重名 请不要更改这个名字
  34. config.cancelToken = new axios.CancelToken((c)=>{
  35. lastGetRequestList.has(config.url) ? removePreRequest(config.url,c) : lastGetRequestList.set(config.url,c)
  36. });
  37. // 去除参数中的 takeLastRequestResult
  38. if(config.params){
  39. config.params.takeLastRequestResult=undefined
  40. }
  41. }
  42. return config
  43. },
  44. err=>{
  45. console.log(err);
  46. return Promise.reject(err)
  47. }
  48. )
  49. request.interceptors.response.use(
  50. res=>{
  51. postRequestList.delete(`${res.config.url}`)
  52. lastGetRequestList.delete(`${res.config.url}`)
  53. if(res.request.responseType.toLowerCase()==='blob'){
  54. // 字节流
  55. if(res.status === 200){
  56. return res.data
  57. }
  58. }else if(res.data.code==200){
  59. return res.data
  60. }else if(res.data.code==4010 || res.data.code==401){
  61. // 4010 禁用操作 401 token过期
  62. ElMessage({
  63. message:res.data.msg || '未知错误,请重新登录',
  64. type:'error',
  65. duration:1500
  66. })
  67. localStorage.removeItem('fsms_token')
  68. localStorage.removeItem('userInfo')
  69. setTimeout(()=>{
  70. location.reload()
  71. },1500)
  72. return Promise.reject(new Error(res.data.msg ||'未知错误,请重新登录'))
  73. }else{
  74. ElMessage({
  75. message:(res.data && res.data.msg) ? res.data.msg : '网络异常',
  76. type:'error',
  77. duration:3*1000
  78. })
  79. return Promise.reject(new Error(res.data.msg ||'网络异常'))
  80. }
  81. },
  82. err=>{
  83. const {message} = err
  84. console.log(message,'--错误信息');
  85. if(!err.__CANCEL__){
  86. // 清除
  87. postRequestList.clear()
  88. lastGetRequestList.clear()
  89. // 多次点击由CancelToken取消的请求不给错误提示
  90. ElMessage({
  91. message: message || '网络异常',
  92. type: 'error',
  93. duration: 3 * 1000
  94. })
  95. }
  96. return Promise.reject(err)
  97. }
  98. )
  99. export default request