zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    这个Pandas函数可以自动爬取Web图表
    /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /usr/local/python3.6/lib/python3.6/site-packages/paddle/fluid/core_avx.so)
    kubernetes yaml详解
    centos 安装kubernetes
    初识kafka-connect
    Docker1:本地连接Docker中的mysql,实现数据同步
    git分支管理规范
    cat 配置告警规则
    Java的即时编译(Just In Time, JIT)及其优化
    java自定义实现一个缓存器
  • 原文地址:https://www.cnblogs.com/aleafo/p/12430752.html
Copyright © 2011-2022 走看看