当http响应状态为400时使用fetch api获取自定义错误消息[关闭]
Posted
技术标签:
【中文标题】当http响应状态为400时使用fetch api获取自定义错误消息[关闭]【英文标题】:Getting custom error message using fetch api when http response status is 400 [closed] 【发布时间】:2019-06-20 14:19:48 【问题描述】:我有 Python Flask (v 1.0.0) 后端,它返回状态为 400 的 http 响应和自定义错误消息
return Response('My custom errror message', 400)
在我的前端,我使用 Fetch API 对后端进行 API 调用:
fetch(url, options)
.then(response => response.json())
.then(response => console.log(response))
.catch(error => console.log(error));
由于 400 是 BAD REQUEST
,fetch
直接转到 catch
,而我只有 TypeError: Failed to fetch
消息。
如何在前端获取自定义错误消息而不是 Failed to fetch
消息?它在 DevTools 中可见,所以我希望它应该以某种方式在 fetch
中可用?
【问题讨论】:
您是否尝试过访问then
块中的响应代码?
它直接转到.catch
,我认为是因为它是 400 响应,fetch
立即将其视为错误。
试试这个 github.com/github/fetch/issues/203#issuecomment-143347675
【参考方案1】:
原来是nginx配置问题。当我说当响应为 400 时 fetch 直接转到 .catch
时我是对的,但原因是请求实际上失败了——我在控制台中看到了一个 CORS 错误。
将always
参数添加到我的nginx 配置后,不再有CORS 错误,我可以在.then
中访问My custom error message
,它不再直接访问.catch
。
更多细节在这里:nginx add headers when returning 400 codes
【讨论】:
【参考方案2】:如果状态超出 200-299 范围,Fetch 不会抛出异常。您正在尝试将纯文本(“我的自定义错误消息”)解析为 json,这就是异常的原因。在调用json()
之前,您必须检查response.status
【讨论】:
tldr:调用text()
而不是json()
获取response.status === 400
即使我将我的第一个 .then
更改为 .then(response => console.log(response.status))
,它也会直接转到 .catch
- 第一个 .then
甚至都不会执行以上是关于当http响应状态为400时使用fetch api获取自定义错误消息[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如果 REST API 方法失败,我应该返回 200、400 还是 500 HTTP 状态消息?
如何获取返回 Http 状态代码 406 或 400 的 API 的响应 JSON
POST / PUT 上的 Java Spring REST API 状态 400 响应
当 url 响应状态代码为 400 时如何使用 C# .Net Core 5 Blazor 服务器端应用程序中的中间件重定向到主页