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

Axios+Express+Node.js环境下PUT请求失败后前端无法获取后端返回的errorMessage问题排查

问题原因与解决方案:前端无法获取后端返回的errorMessage

这问题我之前也碰到过,核心原因是Axios的响应处理机制在搞鬼:当后端返回4xx/5xx这类非成功状态码时,Axios会自动把这个响应当成错误,直接丢进.catch()回调里,根本不会走到你写的.then()逻辑里。

具体拆解:

  • 后端代码是没问题的:你返回400状态码+带errorMessage的JSON对象,console.log也能输出错误信息,说明后端已经正确生成了错误响应。
  • 前端逻辑踩了Axios的坑:你现在在.then()里判断res.errorMessage,但因为400不是2xx状态码,这个分支根本不会执行,错误信息其实藏在.catch()的err.response.data里。

修改后的前端代码:

handleSubmit = (event) => { 
  event.preventDefault(); 
  const authorization = localStorage.getItem("accessToken"); 
  axios 
    .put( 
      `${process.env.REACT_APP_SERVER_URL}/settings/password`, 
      this.state.user, 
      { headers: { authorization, }, } 
    ) 
    .then((res) => { 
      // 只有状态码2xx才会走到这里,直接处理成功逻辑
      console.log("updating - res:", res); 
      this.setState({ user: res.data, }); 
    }) 
    .catch((err) => { 
      // 非2xx状态码的响应都会走到这里
      if (err.response?.data?.errorMessage) {
        console.log(err.response.data.errorMessage, "Unsuccessful password updated"); 
      } else {
        console.log(err, "ERROR"); 
      }
    }); 
};

补充说明:

  • 用err.response?.data?.errorMessage是做了可选链判断,避免因为某些极端情况(比如后端没返回data,或者网络错误连response都没有)导致代码报错。
  • 如果你希望某些4xx状态码也进入.then(),可以给Axios配置validateStatus选项,比如:
axios.put(url, data, {
  headers: { authorization },
  validateStatus: (status) => status < 500 // 只要状态码小于500都进入then
})

不过一般不建议这么做,遵循HTTP状态码的语义会让逻辑更清晰。

内容的提问来源于stack exchange,提问作者mnn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 08:33:14