为何配置Axios的validateStatus后仍无法捕获Mock.js生成的404响应?
问题原因分析
你的问题出在Mock.js的响应格式错误,而非Axios配置问题:
你在Mock的getCurve函数中返回的{ status:404, ... },这个对象会被Mock直接作为**响应体(data)**返回给Axios,而非设置真实的HTTP响应状态码。也就是说,Axios实际收到的HTTP响应状态码仍然是200(Mock默认的成功状态),只是响应data里多了一个status:404的字段。这就导致Axios的validateStatus判断当前状态码是200,符合成功条件,所以Promise始终进入then回调,不会触发catch。
解决方案
修改Mock的响应逻辑,让它正确模拟HTTP状态码:
当需要返回404错误时,要返回一个包含status(HTTP状态码)和data(响应体)的对象,这样Mock会把status设置为HTTP响应状态码,Axios才能正确识别:
export default { getCurve: config => { const urlString = config.url; const urlObj = url.parse(urlString); const queryParams = queryString.parse(urlObj.query); let results = []; let curve1 = []; let curve2 = []; let curve3 = []; for (let i = 0; i < 3000; i++) { curve1.push(Math.random() * 300) } results.push(curve1) for (let i = 0; i < 3000; i++) { curve2.push(Math.random() * 500) } results.push(curve2) for (let i = 0; i < 3000; i++) { curve3.push(Math.random() * 700) } results.push(curve3) if (queryParams.test_id == '1234') { if (queryParams.curve_index < 2) { // 成功响应:设置HTTP状态码200,业务数据放在data中 return { status: 200, data: { data: results[queryParams.curve_index], count_data: 3 } } } else { // 错误响应:设置HTTP状态码404,业务数据放在data中 return { status: 404, data: { data: results[queryParams.curve_index], count_data: 3 } } } } } }
额外说明
- Axios的
validateStatus配置是完全正确的:它基于HTTP响应的真实状态码判断Promise走向,只有状态码不在2xx范围内时才会触发catch。 - 之前你返回的
code:200属于业务自定义状态码,和HTTP状态码是两个独立层面的内容;如果需要保留业务码,只需将其放在data字段中即可。
内容的提问来源于stack exchange,提问作者simon
相关产品推荐
相关产品推荐

