约定 src/app.tsx 为运行时配置

import { request } from ‘umi’;
umijs 默认使用 request 请求数据,通过 request 配置来

  • 自定义中间件
  • 拦截器
    • requestInterceptors 请求拦截器
    • responseInterceptors 响应拦截器
  • 错误处理适配
    • errorConfig

axios

request 拦截器文档 https://umijs.org/docs/max/request#requestinterceptors
配置的规则将应用于所有的 request 和 useRequest 方法
其它配置都直接透传 axios 的 request 配置

  1. import { message } from 'antd';
  2. import { isEmpty } from 'lodash-es';
  3. import type { RequestConfig } from '@umijs/max';
  4. import { JWT_TOKEN } from '@/constants';
  5. export const request = {
  6. timeout: 5000,
  7. // 请求设定统一的错误处理方案
  8. errorConfig: {
  9. errorHandler() {
  10. console.log('request errorHandler')
  11. },
  12. // catch 抛出的错误 触发条件,当 data.success = false
  13. errorThrower(err: { msg: string | null | undefined }) {
  14. message.destroy()
  15. message.error(err.msg)
  16. },
  17. },
  18. // 请求拦截器
  19. requestInterceptors: [
  20. (config: RequestConfig) => {
  21. if(config.version === 'v2') {
  22. config.baseURL = process.env.APP_BASE_API_V2
  23. }
  24. const { method, data } = config
  25. const isMethod = filterMethods.includes(method)
  26. if (isMethod && !isEmpty(data)) {
  27. // 过滤 null等字段
  28. config.data = omitValues(data, ['createdAt', 'updatedAt'])
  29. }
  30. const token = localStorage.getItem(JWT_TOKEN)
  31. if (token) {
  32. config.headers!.Authorization = `Bearer ${token}`
  33. }
  34. return config
  35. },
  36. ],
  37. // 响应拦截器
  38. responseInterceptors: [
  39. (response: { status: any; data: any }) => {
  40. // 不再需要异步处理读取返回体内容,可直接在data中读出,部分字段可在 config 中找到
  41. const { status, data } = response
  42. if (status !== 200) {
  43. return response
  44. }
  45. if (data.code === 0) {
  46. return data
  47. }
  48. if (401 === data.status) {
  49. location.href = '/login'
  50. return
  51. }
  52. return response
  53. },
  54. ],
  55. }