使用Axios.create调用接口返回response.data为空,直接axios.post正常
问题排查&解决步骤
1 优先检查拦截器配置
- 确认你是否给
axios.create生成的client实例单独配置了响应拦截器,如果拦截器中直接返回了response.data,那你调用postRequest拿到的res本身就是响应数据,再次取res.data就会为空 - 确认全局
axios的拦截器不会作用于自定义实例:自定义axios实例不会继承全局配置的拦截器,如果你之前全局拦截器做了响应数据的脱壳处理,自定义实例不会复用该逻辑,此时你拿到的res.data是接口返回的完整结构,需确认业务数据是否在res.data.data层级
2 对比两次请求的实际参数差异
打开浏览器控制台Network面板,对比自定义实例发起的请求和直接axios.post发起的请求的以下信息是否完全一致:
- 请求的完整URL(确认
baseURL拼接是否正确,避免斜杠重复/缺失导致请求地址错误) - 请求头(比如是否缺失
Authorization、Cookie等鉴权字段,是否配置了withCredentials) - 请求体payload格式
可以用以下代码直接打印两者的完整配置做对比:
// 打印自定义实例的请求配置和完整响应 const clientRes = await client.post('/login', body) console.log('自定义实例完整响应:', clientRes) console.log('自定义实例请求配置:', clientRes.config) // 模拟和实例配置完全一致的直接调用 const directRes = await axios.post(`${BASE_URL}/login`, body, { headers: { "Content-Type": "application/json", "Accept": "application/json", } }) console.log('直接调用完整响应:', directRes) console.log('直接调用请求配置:', directRes.config)
3 检查自定义实例的额外配置
确认你的client实例有没有配置以下影响响应解析的参数:
- 是否错误设置了
responseType: 'blob'/'arraybuffer'等非json格式,导致响应解析失败 - 是否配置了自定义的
transformResponse逻辑,错误处理了响应数据 - 若接口返回空数据,确认
res.status是否为204(无内容),一般是鉴权失败/参数错误导致接口未返回内容
4 修复示例
如果确认是拦截器缺失导致需要手动脱壳,可以给自定义实例补充响应拦截器:
const client = axios.create({ baseURL: BASE_URL, headers: { "Content-Type": "application/json", "Accept": "application/json", }, }); // 补充响应拦截器,和直接调用axios的表现对齐 client.interceptors.response.use( (response) => response.data, // 直接返回业务数据层 (error) => Promise.reject(error) )
内容的提问来源于stack exchange,提问作者Hassan Ali
相关产品推荐
相关产品推荐

