You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 16:06:28