当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 REQUESTfetch 直接转到 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

在 React JS 中使用 fetch 处理响应状态

POST / PUT 上的 Java Spring REST API 状态 400 响应

当 url 响应状态代码为 400 时如何使用 C# .Net Core 5 Blazor 服务器端应用程序中的中间件重定向到主页

Fetch api - 在 then 和 catch 块中获取 json 主体以获取单独的状态代码