tldr在发送模式为"no cors"的提取请求时,如何将不透明响应与网络错误区分开来
我相信:
- 不透明响应静默失败-fetch解析
- 网络错误导致fetch失败-fetch拒绝
有人能确认吗(编辑:与此处使用的方法相同(
背景:在我的UI中,我想检查各种URL是否可以访问(例如,它们没有被防火墙阻止(。在这个答案中:https://stackoverflow.com/a/53442328/1534823上面写着:
无cors模式意味着,如果浏览器必须执行任何需要cors许可的操作,它将以静默方式失败,而不是抛出错误。
问题:
如果获取请求的标头为"no cors":
- 。。。遇到网络错误-这会导致fetch promise被拒绝吗
- 。。。遇到CORS问题-它将无声地失败,即获取承诺将解决
文档:
Pro:在chrome dev工具中,我可以通过阻止域来模拟网络错误,这似乎表明上述两种说法是正确的,但我不确定这在多大程度上反映了真实的网络错误。
Contra:这些文档没有提到CORS异常也会为获取抛出TypeError:https://developer.mozilla.org/en-US/docs/Web/API/fetch#exceptions
对照:在提取规范中:https://fetch.spec.whatwg.org/#concept-过滤响应不透明上面写着:
换句话说,不透明的过滤响应和不透明的重定向过滤响应与网络错误几乎无法区分。
。。。或者我可以以某种方式使用CORS飞行前请求来检查是否可以访问不允许CORS的服务器吗?(或者只是发送OPTIONS请求?(
这里有很多问题。
你是正确的,不透明的回应不会导致拒绝承诺。然而,CORS故障会导致网络错误,而不是不透明的响应。然而,如果使用";CCD_ 1";(请注意,这不是标头,而是Request
对象的输入(。
用";CCD_ 3";您可以使用的HTTP方法受到限制,所以OPTIONS
不是一个选项(不是开玩笑的(。浏览器也越来越多地限制";CCD_ 5";在Spectre的世界里,这些回应是有问题的。https://github.com/annevk/orb对此有更多详细信息。因此,长期使用fetch(url, { mode: "no-cors" })
可能无法获得您想要的结果,因为您将越来越多地看到更多的网络错误,尽管服务器可能是可访问的。