捕获 Javascript 获取失败,Cloudflare 429 缺少 CORS 标头

问题描述 投票:0回答:2

我正在使用 Fetch 在 JavaScript 中发出跨源请求

Cloudflare(代理我的流量)有时会返回 429(速率限制)。

当它们返回 429 时,它们不包含

Access-Control-Allow-Origin
标头。

所以现在我的

fetch
mode: 'cors'
失败了,并抛出了
TypeError

当发生这种情况时,以及当它因网络错误等其他原因引发时,我如何捕获?

我的代码如下:

    try {
        let response = await fetch(uri, config); // this throws
        if (!response.ok) { // this line does not run
            throw response.statusText;
        }
        let json = await response.json();
        return json;
    } catch (e) {
        console.log(e.message); // "Failed to fetch"
    }

检查 MDN 文档,我不确定是否可以将这个 429 与其他网络错误分开检测?

当遇到网络错误或服务器端 CORS 配置错误时, fetch() Promise 将拒绝并返回 TypeError ,尽管这通常意味着权限问题或类似问题

javascript cors fetch-api cloudflare
2个回答
0
投票

简短的版本是你不能,这是设计使然。

唯一可以解决此问题的地方是服务器端。需要更改/配置 Cloudflare 以发送适当的标头,或者使用其他服务来发送错误标头。

如果没有服务器端更改,该错误将是一般的 CORS 错误。

另一种选择可能是构建类似“iframe 代理”的东西,有效地让您完全规避 CORS。


-1
投票

状态码:当用户在给定时间内发送过多请求时,返回429。 这意味着 eventListner 正在发出多个请求(这就是我的想法)。

因此,要阻止 eventListners 发出多个请求,请使用

event.stopImmediatePropagation();

如果多个侦听器针对同一事件类型附加到同一元素,则按照添加顺序调用它们。如果在一次此类调用期间调用 stopImmediatePropagation(),则不会调用剩余的侦听器。

在此处阅读有关此内容的更多信息MDN 文档。

© www.soinside.com 2019 - 2024. All rights reserved.