DefHttp.js 2.92 KB
let requestQueue = []

const JWT_TOKEN_KEY = 'JWT_TOKEN';
const REFRESH_TOKEN_KEY = 'REFRESH_TOKEN';
/**
 * custom http request
 */
function createAxios(options) {
  /**
   * 创建实例
   */
  const instance = axios.create({
    baseURL: options.baseURL,
    timeout: options.timeout,
    headers: {
      "content-type": "application/json; charset=UTF-8",
      "X-Authorization": "Bearer " + GLOBAL_TOKEN.token,
    },
  });

  instance.interceptors.request.use((config) => {
    config.headers["X-Authorization"] = "Bearer " + GLOBAL_TOKEN.token

    return config
  }, (error) => {
    console.log(error)
    return error
  })

  /**
   * 数据返回拦截-响应拦截器
   */
  instance.interceptors.response.use(
    function (response) {
      return response.data;
    },
    function (error) {
      if (error.response.status == 401) {
        // layer.alert('登录超时,请重新登录');
        // const config = error.config
        // const url = config.url
        // const method = config.method
        // const data = config.data
        // const flag = requestQueue.find(item => item.url === url)
        // if (!flag) {
        //   console.log(url, method, data)
        //   requestQueue.push({ url, method, data })
        // }

        doRefreshToken()
      }

      const message = error.response && error.response.data && error.response.data.message
      const { layer } = layui
      message && layer.msg(message, { icon: 5 })

      return Promise.reject(error);
    }
  );
  return instance;
}


/**
 * @description refresh token
 * @param {} params 
 * @returns 
 */
function doRefreshToken(params) {
  const refreshToken = GLOBAL_TOKEN.refreshToken
  return new Promise((resolve, reject) => {
    axios.post('/api/auth/token',
      { refreshToken },
      {
        headers: {
          "content-type": "application/json; charset=UTF-8",
          "X-Authorization": "Bearer " + GLOBAL_TOKEN.token,
        },
      })
      .then(res => {

        // 存储token
        const { refreshToken, token } = res.data
        Object.assign(GLOBAL_TOKEN, { refreshToken, token })
        const ls = createStorage({ storage: localStorage })
        const originData = ls.get(GLOBAL_STORAGE_KEY)
        const newRefreshToken = ls.generatorValue(REFRESH_TOKEN_KEY, refreshToken, true)
        const newToken = ls.generatorValue(REFRESH_TOKEN_KEY, token, true)
        ls.set(GLOBAL_STORAGE_KEY, Object.assign(originData, { [REFRESH_TOKEN_KEY]: newRefreshToken, [JWT_TOKEN_KEY]: newToken }), true)

        // try {
        //   requestQueue.forEach(item => {
        //     const { method, url, data } = item
        //     defHttp[method](url, data)
        //   })
        //   requestQueue = []
        // } catch (error) {

        // }

        window.location.reload()
        resolve()
      })
      .catch((error) => {
        const { origin } = window.location
        window.location.href = `${origin}/login`
        reject(error)
      })
  })
}