MicroFish/frontend/src/api/index.js

79 lines
2.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import axios from 'axios'
import i18n from '../i18n'
// 创建axios实例
const service = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:5001',
timeout: 300000, // 5分钟超时本体生成可能需要较长时间
headers: {
'Content-Type': 'application/json'
}
})
// 请求拦截器
service.interceptors.request.use(
config => {
config.headers['Accept-Language'] = i18n.global.locale.value
return config
},
error => {
console.error('Request error:', error)
return Promise.reject(error)
}
)
// 响应拦截器(容错重试机制)
service.interceptors.response.use(
response => {
const res = response.data
// 如果返回的状态码不是success则抛出错误
if (!res.success && res.success !== undefined) {
console.error('API Error:', res.error || res.message || 'Unknown error')
return Promise.reject(new Error(res.error || res.message || 'Error'))
}
return res
},
error => {
console.error('Response error:', error)
// 优先使用后端返回的 JSON 错误信息(后端在 4xx/5xx 时也会返回 {"success": false, "error": "..."}
if (error.response && error.response.data) {
const data = error.response.data
const msg = data.error || data.message || data.traceback || `请求失败 (${error.response.status})`
return Promise.reject(new Error(msg))
}
// 处理超时
if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
console.error('Request timeout')
return Promise.reject(new Error('请求超时,请稍后重试'))
}
// 处理网络错误
if (error.message === 'Network Error') {
console.error('Network error - please check your connection')
return Promise.reject(new Error('网络错误,请检查连接'))
}
return Promise.reject(error)
}
)
// 带重试的请求函数
export const requestWithRetry = async (requestFn, maxRetries = 3, delay = 1000) => {
for (let i = 0; i < maxRetries; i++) {
try {
return await requestFn()
} catch (error) {
if (i === maxRetries - 1) throw error
console.warn(`Request failed, retrying (${i + 1}/${maxRetries})...`)
await new Promise(resolve => setTimeout(resolve, delay * Math.pow(2, i)))
}
}
}
export default service