req.js 2.55 KB
const axios = require('axios')
import store from '@/store/login'
import {Message} from 'element-ui'
import tenant from '@/store/tenant'

const instance = axios.create({
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  }
})

instance.interceptors.request.use(config => {
  config.headers = config.headers || {}
  if (config.headers && config.headers.constructor == String) {
    try {
      config.headers = JSON.parse(config.headers)
    } catch (e) {
      Message.error(`请求头部不是有效的JSON格式:${config.headers}`)
      throw e
    }
  }
  const currentUser = store.state.currentUser
  currentUser &&
    currentUser.token &&
    !config.headers.Authorization &&
    (config.headers.Authorization = `Bearer ${currentUser.token}`)
  if (tenant.state.tenantId && config.url.indexOf('tenantId=') == -1) {
    let joinChar = '?'
    if (config.url.indexOf('?') != -1) {
      joinChar = '&'
    }
    config.url = config.url + joinChar + 'tenantId=' + tenant.state.tenantId
  }
  return config
})

instance.interceptors.response.use(
  response => {
    const {data, config, headers} = response

    if (config) {
      const {responseType} = config
      // 请求的返回值类型为arraybuffer时返回headers
      if (responseType && responseType == 'arraybuffer') {
        return {data, headers}
      }
    }

    if (headers) {
      // 附件下载,需要返回 headers
      const content = headers['content-disposition']
      if (content && content.startsWith('attachment;')) {
        return {data, headers}
      }
    }

    return data
  },
  error => {
    // 处理响应失败
    const errorMessage =
      error &&
      error.response &&
      error.response.data &&
      error.response.data.message
        ? error.response.data.message
        : error.message
    if (error && error.response && error.response.status === 500) {
      if (error.response.data && error.response.data.message) {
        Message.errorLog(error.response.data.message, error.response.data.logId)
      } else if (
        error.response.config.url.indexOf(
          'dataTemplate/v1/exportByBtnSetting'
        ) != -1
      ) {
        return Promise.reject(error)
      } else {
        Message.error(error.message)
      }
    } else if (
      error &&
      error.isAxiosError &&
      error.response &&
      error.response.status != 403
    ) {
      Message.error(errorMessage)
    } else if (errorMessage && typeof errorMessage != 'undefined') {
      Message.error(errorMessage)
    }
    return Promise.reject(error)
  }
)

export default instance