为何Express返回错误但Promise.allSettled仍显示fulfilled?
问题原因解析
- 核心原因是Axios的默认行为,和Express(json-server基于Express)返回的内容无关:
- Axios默认只在请求彻底失败时(比如断网、服务器连不上、DNS解析错误)才会让Promise进入
rejected状态; - 只要服务器返回了合法的HTTP响应——哪怕是429、500这类错误状态码——Axios都会把对应的Promise标记为
fulfilled,只是会把错误信息(比如状态码、响应内容)打包成AxiosError对象作为resolve的结果返回。
- Axios默认只在请求彻底失败时(比如断网、服务器连不上、DNS解析错误)才会让Promise进入
- 你看到AxiosError,是因为Axios内部把非2xx的响应包装成了错误对象,但这并不改变Promise的状态——只要服务器有响应,Promise就会成功resolve这个错误对象。
让对应Promise变成rejected的方法
如果想让4xx/5xx这类错误状态码触发Promise的rejected状态,只需要修改Axios的validateStatus配置,指定只有2xx范围内的状态码才算请求成功:
// 创建Axios实例时配置 const axiosInstance = axios.create({ validateStatus: (status) => { return status >= 200 && status < 300; // 仅2xx状态码视为请求成功 } });
之后再请求id=4的接口,Axios就会因为状态码不符合要求抛出错误,对应的Promise就会进入rejected状态,Promise.allSettled里的结果状态也会变成rejected。
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

