我正在使用 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 ,尽管这通常意味着权限问题或类似问题
简短的版本是你不能,这是设计使然。
唯一可以解决此问题的地方是服务器端。需要更改/配置 Cloudflare 以发送适当的标头,或者使用其他服务来发送错误标头。
如果没有服务器端更改,该错误将是一般的 CORS 错误。
另一种选择可能是构建类似“iframe 代理”的东西,有效地让您完全规避 CORS。
状态码:当用户在给定时间内发送过多请求时,返回429。 这意味着 eventListner 正在发出多个请求(这就是我的想法)。
因此,要阻止 eventListners 发出多个请求,请使用
event.stopImmediatePropagation();
如果多个侦听器针对同一事件类型附加到同一元素,则按照添加顺序调用它们。如果在一次此类调用期间调用 stopImmediatePropagation(),则不会调用剩余的侦听器。
在此处阅读有关此内容的更多信息MDN 文档。