VUE SSR 服务端渲染模式下, axios interceptors执行两次/多次的问题

随手记录一下吧。

具体的 node端渲染原理懒得去探求究竟了。 根据debug跟踪发现,是axios配置reques的时候,没有通过create实例化,而是直接修改了axios的interceptors,因此导致服务端运行出现异常。服务端渲染模式下, 每个请求 interceptors 里面的内容都会打印两次。

尝试将request的封装,改为先实例化axios,然后修改实例的 interceptors。 问题得到修复。

贴个代码吧。

 

出现bug的代码:

import axios from 'axios';
import Vue from 'vue';
import { Toast } from 'vant';
Vue.use(Toast);

// axios 配置
axios.defaults.timeout = 5000;
axios.defaults.baseURL = 'http://127.0.0.1:7001';

// http request 拦截器
axios.interceptors.request.use(
  config => {
    // const authToken = localStorage.getItem('authToken');
    // if (authToken) {
    //   config.headers.Authorization = `Bearer ${authToken}`;
    // }
    return config;
  },
  err => {
    return Promise.reject(err);
  }
);

// http response 拦截器
axios.interceptors.response.use(
  response => {
    if (EASY_ENV_IS_NODE) {
      console.log('EASY_ENV_IS_NODE response=========>', response);
    } else {
      console.log('FRONT END response=========>', response);
    }
    return response.data;
  },
  error => {
    console.log('error', error);
    if (error.response) {
      Toast('服务器内部错误,请联系管理员!');
    }
    // console.log(JSON.stringify(error));//console : Error: Request failed with status code 402
    // return Promise.reject(error.response.data);
    return { status: 500, error: JSON.stringify(error) };
  }
);

export default axios;

 

 

 

 

修复后:

import axios from 'axios';
import Vue from 'vue';
import { Toast } from 'vant';
Vue.use(Toast);

// axios 配置
const request = axios.create({
  timeout: 5000,
  baseURL: 'http://127.0.0.1:7001',
});

// http request 拦截器
request.interceptors.request.use(
  config => {
    // const authToken = localStorage.getItem('authToken');
    // if (authToken) {
    //   config.headers.Authorization = `Bearer ${authToken}`;
    // }
    return config;
  },
  err => {
    return Promise.reject(err);
  }
);

// http response 拦截器
request.interceptors.response.use(
  response => {
    return response.data;
  },
  error => {
    console.log('error', error);
    if (error.response) {
      Toast('服务器内部错误,请联系管理员!');
    }
    // console.log(JSON.stringify(error));//console : Error: Request failed with status code 402
    // return Promise.reject(error.response.data);
    return { status: 500, error: JSON.stringify(error) };
  }
);

export default request;

 

posted @ 2020-03-06 20:47  前端小小菜  阅读(781)  评论(0编辑  收藏  举报