axios.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import _ from 'lodash'
  2. import axios from 'axios'
  3. const DataFormatError = new Error('后台响应数据格式异常')
  4. export default ({store, app, req}, inject) => {
  5. const service = axios.create({
  6. withCredentials: true,
  7. // 根据运行环境确定请求BaseUrl
  8. baseURL: process.server ? process.env.baseUrl : '/'
  9. })
  10. service.interceptors.request.use(config => {
  11. if (process.server) {
  12. // 服务器端发送请求时,使用浏览器的客户端信息和Cookie
  13. config.headers.cookie = req.headers.cookie || ''
  14. config.headers['User-Agent'] = req.headers['user-agent']
  15. }
  16. return config
  17. }, error => {
  18. return Promise.reject(error)
  19. })
  20. // Add a response interceptor to handle responses
  21. service.interceptors.response.use(function (response) {
  22. const body = response.data
  23. // Check whether response data is unified format `Object`.
  24. if (_.isString(body)) {
  25. return Promise.reject(DataFormatError.message)
  26. }
  27. if (!body.success) {
  28. return Promise.reject(body.message)
  29. }
  30. return body.data
  31. }, function (error) {
  32. // Unified handle errors
  33. let err = null
  34. if (error.response) {
  35. // The request was made and the server responded with a status code
  36. // that falls out of the range of 2xx
  37. const response = error.response
  38. err = response.data && response.data.message ? response.data.message : response
  39. } else if (error.request) {
  40. // The request was made but no response was received
  41. // `error.request` is an instance of XMLHttpRequest in the browser
  42. // and an instance of http.ClientRequest in node.js
  43. err = error.request
  44. } else {
  45. // Something happened in setting up the request that triggered an Error
  46. err = error.message
  47. }
  48. return Promise.reject(err)
  49. })
  50. inject('axios', service)
  51. }