axios的踩坑记录

288 阅读2分钟

问题起因

在做后台系统的时候,有3个特殊的接口不能走全局的axios,所以需要新建一个axios对象,但是因为新建的axios对象没有设置全局请求拦截、响应拦截,导致返回的数据是如下所示:

{
    config: {transformRequest: {…}, transformResponse: {…}, timeout0xsrfCookieName'XSRF-TOKEN'adapter: ƒ, …}
    data: {successtruemessage'操作成功!'code0result'1524963338696536065'timestamp1652414567051}
    headers: {access-control-allow-credentials'true', access-control-allow-methods'GET,POST,OPTIONS,PUT,DELETE', access-control-allow-origin'http://localhost:8087'connection'close', content-encoding'gzip', …}
    requestXMLHttpRequest {readyState4timeout0withCredentialsfalseuploadXMLHttpRequestUploadonreadystatechange: ƒ, …}
    status200
    statusText"OK"
 }

而真正的返回数据,其实是在data

通常情况下的asiox请求流程

import axios from 'axios'

let apiBaseUrl = '/zeen-safe/';

const service = axios.create({
    //baseURL: '/jeecg-boot',
 
  // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
  // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL

    baseURL: apiBaseUrl, // api base_url
    timeout: 30000 // 请求超时时间
})

// 请求拦截
// request interceptor
service.interceptors.request.use(config => {
    // some code...
}, (error) => {
    return Promise.reject(error)
})


// 响应拦截
// response interceptor
service.interceptors.response.use((response) => {
  return response.config.url.includes('/ffmpeg/cut') ? response: response.data
}, err)


export {
    installer as VueAxios,
    service as axios
    // 将service导出为axios (也就是说,在需要用到的js文件中,import { axios } from '' 即可 )
    
}

配置默认项

全局的axios默认值

axios.defaults.baseURL = 'https://api.example.com'; 
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN; 
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; 

自定义实例默认值

// Set config defaults when creating the instance 
const instance = axios.create({   baseURL: 'https://api.example.com' }); 
// Alter defaults after instance has been created 
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN; 

配置优先顺序

配置会以一个优先顺序进行合并。这个顺序是:在 lib/defaults.js 找到的库的默认值,然后是实例的 defaults 属性,最后是请求的 config 参数。后者将优先于前者。这里是一个例子:

// 使用由库提供的配置的默认值来创建实例 
// 此时超时配置的默认值是 `0` 
var instance = axios.create();  

// 覆写库的超时默认值 // 现在,在超时前,所有请求都会等待 2.5 秒 
instance.defaults.timeout = 2500; 

// 为已知需要花费很长时间的请求覆写超时设置
instance.get('/longRequest', {   timeout: 5000 });

个人博客地址 欢迎访问