fetch返回401仍进入resolved却打印错误日志是否为预期行为?
这确实是fetch的预期行为!
你观察到的现象完全符合fetch API的设计逻辑,我来给你拆解清楚:
为什么401会进入resolved分支?
fetch的Promise只会在网络层面发生故障时才会reject(比如断网、域名解析失败、请求被浏览器安全策略拦截)。只要服务器成功返回了HTTP响应——哪怕是4xx客户端错误(比如401未授权)、5xx服务器错误——fetch都会认为这是一个“成功完成的请求”,进而进入then分支。
简单说:fetch只关心“请求有没有发出去并拿到服务器的回应”,不关心回应里的状态码是成功还是失败。
那控制台的错误日志是怎么回事?
你看到的控制台错误是浏览器的默认行为——浏览器会自动记录所有返回非2xx状态码的请求,但这不是fetch抛出的错误,也不会影响你的代码逻辑,只是浏览器帮你标记了这个请求的异常状态。
怎么按HTTP状态码处理错误?
如果想把4xx/5xx这类响应当作错误处理,可以在then里手动判断响应状态,然后抛出错误让catch分支处理,比如:
componentWillMount() { this.setState({ isInitializing: true }); fetch('/api/users/getcurrent') .then(resp => { console.log('resolved'); // 用resp.ok快速判断状态码是否在200-299范围内 if (!resp.ok) { // 可以针对401做特殊处理,或者直接抛出错误 throw new Error(`请求失败:${resp.status} ${resp.statusText}`); } // 处理正常响应的逻辑 // do stuff this.setState({ isInitializing: false }); }) .catch(err => { console.log('catched', err); this.setState({ isInitializing: false }); // 这里可以处理401的逻辑,比如跳转到登录页 }); }
内容的提问来源于stack exchange,提问作者Dmitry Pavlushin
相关产品推荐
相关产品推荐

