6.15一些知识点散记

144 阅读3分钟

1.在使用axios时,在大型项目中可能会用到多个路径去获取数据,此时如果使用axios.default.baseURL去设置基准路径的话,引用axios文件时会把所有基准路径限定为一个。

// 创建一个axios实例,和之前使用axios是一样的
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // 如果超过五秒为获取到数据则报错
})
export default service //暴露出去

这样操作有利于分开每一个不同的路径去获取数据,需要A就用A实例,需要B就用B实例。(如果需要添加拦截器的话,需要用service.interceptors.response.use())。

2.如果后台没有处理跨域获取数据的问题,我们可以使用代理的方式去获取数据。

如图所示: image.png

// 在vue.config.js中的devServer中添加,代理配置叫 proxy 对象
    proxy: {
      // 键值对的形式, 指定应该转发的url模式:转发的目的地
      'api': {
        target: 'http://ihrm-java.itheima.net',
        changeOrigin: true//跨域设定的开启
      }
    }

3.对于高频使用的数据(在大型项目中使用vuex来保存数据)

如图所示: image.png 因此在做一个类似于登录的模块中可以这么操作:

try {
        await this.$refs.loginForm.validate()// 返回一个布尔值
        await this.$store.dispatch('user/login', this.loginForm)
        this.$message.success('登录成功')
        this.$router.push('/')
      } catch (error) {
        console.log(error)
      }

首先使用validate去验证,然后调用action去操作登录数据,await返回登录后的结果,然后接下一步操作,如果报错就会直接进入catch中执行。在action中去调用封装好的登录请求,然后返回的结果给mutation再去操作保存state中的token。

当然因为是请求,所以可以加入拦截器进一步去做数据的操作。

service.interceptors.response.use((res) => {
  console.log('响应拦截器')
  console.log(res)
  if (res.data.success) {
    // 全部成功
    return res.data.data
  } else {
    // 失败
    // 提示用户
    Message.error(res.data.message)
    // 阻止接下来的操作
    // 响应拦截器其实是在一个 Promise 操作的中间执行
    // 这时候如果想要打断当前的操作, 可以用原生 Promise 对象里面的 reject 方法
    return Promise.reject(res.data.message)
  }
}, () => {
  // 处理错误的部分, 响应码为 200 以外
  Message.error('系统错误')
  return Promise.reject('系统错误')
})

拦截器有请求成功的回调和请求失败的回调,(第一个和第二个)第一个中做的if/else判断服务器端返回的事请求成功或者请求失败(但不管怎么说服务器都给了回复,所以是执行第一个请求成功的回调。)而第二个则是失败以后执行的失败处理。

需要重点关注的是,在async中,如果一个await返回的是一个失败的promise,则会直接进入reject中。但如果拦截器已经提前进行了reject处理,也就是失败处理后,则会数据清空,async会正常的往下执行。 也就是说,我们做数据处理的时候,所有失败返回的promise也好,返回普通值也好,都要在最外层去catch捕获,不然就会视为已处理的失败,清空后在最外层代码中接着执行。