* 创建请求实例
()
| 22 | * 创建请求实例 |
| 23 | */ |
| 24 | function createRequest() { |
| 25 | const ins = axios.create({ |
| 26 | baseURL: getServiceUrl(), |
| 27 | }); |
| 28 | onServiceUrlChange((getUrl) => { |
| 29 | // 重置请求地址 |
| 30 | ins.defaults.baseURL = getUrl(); |
| 31 | }); |
| 32 | |
| 33 | ins.interceptors.request.use(async (val) => { |
| 34 | if ( |
| 35 | ['post', 'get'].includes(String(val.method).toLowerCase()) && |
| 36 | !val.headers['X-Token'] |
| 37 | ) { |
| 38 | // 任何请求都尝试增加token |
| 39 | val.headers['X-Token'] = await tokenGetter(); |
| 40 | } |
| 41 | |
| 42 | return val; |
| 43 | }); |
| 44 | |
| 45 | ins.interceptors.response.use( |
| 46 | (val) => { |
| 47 | /** |
| 48 | * 预处理返回的数据 |
| 49 | */ |
| 50 | val.data = _get(val.data, 'data', val.data); |
| 51 | |
| 52 | return val; |
| 53 | }, |
| 54 | (err) => { |
| 55 | // 尝试获取错误信息 |
| 56 | const responseData = _get(err, 'response.data') ?? {}; |
| 57 | let errorMsg: string = responseData.message; |
| 58 | const code: number = responseData.code; |
| 59 | |
| 60 | if (responseData.type === 'VALIDATION_ERROR') { |
| 61 | // 校验失败 |
| 62 | errorMsg = t('请求参数校验失败'); |
| 63 | |
| 64 | if (Array.isArray(responseData.data)) { |
| 65 | console.error(JSON.stringify(responseData.data)); |
| 66 | |
| 67 | try { |
| 68 | errorMsg += `: ${responseData.data |
| 69 | .map((item: any) => item.field) |
| 70 | .join(', ')}`; |
| 71 | } catch (e) {} |
| 72 | } |
| 73 | } |
| 74 | |
| 75 | // comment it logic because if not throw error, react query will cache `{ data: { result: false, msg: errorMsg, code } }` and has some problem |
| 76 | if (_isFunction(getErrorHook)) { |
| 77 | const isContinue = getErrorHook(err); |
| 78 | // if (isContinue === false) { |
| 79 | // return { data: { result: false, msg: errorMsg, code } }; |
| 80 | // } |
| 81 | } |
no test coverage detected