在浏览器中使用 fetch 的时候,后端因为用户没有认证,返回一个 401 状态码和一些信息,本来打算在 fetch 的 then 里,通过判断 response 的 status 来做区别处理,结果实际情况是,浏览器在发起 fetch 请求后因为返回的状态码是 401,判断请求失败抛了异常,我带着返回内容的响应体和响应状态码全都没了,用.catch()捕获的参数只有一个 TypeError,包含的内容非常有限。
按照网上各路 dalao 的教程来说,应该就算是状态码是 401,但是仍然收到了完整的响应,应该会拿到完整的响应对象的,但是实际上并不是这样。
这里我尝试打印响应对象,但是并没有执行 then 里的逻辑,而是走了 reject,回调方法的参数是一个 TypeError。
还有一些我看不懂的 dalao 们的讨论
1
053700 OP 另外补充一点我的浏览器是 Chrome 63
|
2
serco 2018-01-15 14:24:08 +08:00
明明返回的 404,options 请求就出错了,压根没有到你的处理逻辑。查查看后端的 routes 配置吧
另外这种情况下不会到 then 的,直接检查 response.ok |
3
cloudzqy 2018-01-15 14:28:09 +08:00
跟 401 没关系,压根就没请求成功。
页面是 3000 端口,请求是 3001,我猜是 CORS ? |
6
gongpeione 2018-01-15 14:32:07 +08:00
你这是断在了预检了
|
7
053700 OP 重新补图,这里是后端处理逻辑:
![hQe4.png]( https://img.cdn.lwl12.com/images/2018/01/15/hQe4.png) 这里是抛异常的地方 ![hpgU.png]( https://img.cdn.lwl12.com/images/2018/01/15/hpgU.png) 这里是请求信息 ![hzI7.png]( https://img.cdn.lwl12.com/images/2018/01/15/hzI7.png) 这里是响应正文,里面有我放的一行字 ![h9FL.png]( https://img.cdn.lwl12.com/images/2018/01/15/h9FL.png) |
8
053700 OP @gongpeione 搞定了,感谢 dalao 指点,因为跨域的 OPTIONS 预检请求被拦截导致后面的请求无法发起,所以直接抛了异常,在后端拦截器位置放通所有 OPTIONS 方法的请求,就可以正确发起请求然后获取响应体了。
|