【问题标题】:Why Can't I Access the Response (eg. to Check Response Code) When I Get a 429 With a Fetch当我通过 Fetch 获得 429 时,为什么我无法访问响应(例如检查响应代码)
【发布时间】:2020-10-14 03:15:30
【问题描述】:

如果我这样做:

fetch(someUrl)
  .then(logResponse)
  .catch(logError);

我得到速率限制(即响应有 429 代码),我进入then(我可以看到logResponse 从未运行)。

相反,我直接进入 catch 块,它只是传递了一个非常简单的错误对象,其中包含名称/类型/消息,没有其他内容 (TypeError: Failed to fetch)。

如何访问返回的response(例如,以便我可以通过编程方式识别429)?

【问题讨论】:

  • 浏览器登录 devtools 控制台有哪些错误信息?
  • 访问从原点 'someUrl' 在 'someUrl' 获取已被 CORS 策略阻止:否 'Access-Control-Allow-Origin ' 请求的资源上存在标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。
  • 好的,所以如果 429 错误缺少 Access-Control-Allow-Origin 响应标头,那么提取将失败,并且您的代码将命中 catch 块。但是,如果 429 错误具有 Access-Control-Allow-Origin 响应标头,则提取不应失败,您应该能够以编程方式识别 429 错误并进行处理。
  • 是的,它确实缺少 CORS 标头。但这是否意味着在没有 CORS 标头的 429 上,Javascript 不可能 访问response?因为所有catch 块获得通过的是(非常少的)Error 对象,而不是response。如果是这样,那绝对可以作为这个问题的有效答案。

标签: javascript fetch-api


【解决方案1】:

根据https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#Checking_that_the_fetch_was_successful

当遇到网络错误或 CORS 在服务器端配置错误时, fetch() 承诺将拒绝并返回 TypeError,尽管这通常意味着权限问题或类似问题——例如,404 并不构成网络错误。

这意味着(并且@sideshowbarker 在 cmets 中确认)无法访问此类错误的响应详细信息。最好的方法是 .catch,然后假设 某种网络问题(例如拒绝 CORS 的速率限制 API,但可能是其他原因)是罪魁祸首。

这看起来很奇怪,但很明显,当你得到 429 时,不可能知道你得到了 429 ......除非响应上有 CORS 标头。

【讨论】:

    猜你喜欢
    • 2021-05-04
    • 2021-08-18
    • 2015-08-25
    • 1970-01-01
    • 2021-12-02
    • 2020-07-17
    • 2019-08-20
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多