为啥 fetch 返回 status = 0 的响应?

Posted

技术标签:

【中文标题】为啥 fetch 返回 status = 0 的响应?【英文标题】:Why fetch return a response with status = 0?为什么 fetch 返回 status = 0 的响应? 【发布时间】:2017-03-04 03:03:31 【问题描述】:

我想使用 fetch API 从 URL 获取整个 html 文档。

let config = 
method: 'GET',
headers: 
    'Content-Type': 'application/json',
    'Accept': 'text/html',
    'Accept-Language': 'zh-CN',
    'Cache-Control': 'no-cache'
,
mode: 'no-cors';

fetch('http://www.baidu.com', config).then((res)=> 
console.log(res);).then((text)=> );

当我在 chrome 中运行代码时,它会触发一个请求并在 chrome 网络选项卡中返回 html。但 fetch res 返回:

为什么状态为 0,我怎样才能获得像 chrome 网络中的那样正确的 res ?

【问题讨论】:

状态 0 依赖于库,fetch 函数来自哪个库? fetch 是本机函数(现在)。 【参考方案1】:

config.modeno-cors 部分:

no-cors — 防止方法成为 HEAD、GET 或 POST 以外的任何方法。如果任何 ServiceWorkers 拦截了这些请求,他们可能不会添加或覆盖除这些之外的任何标头。此外,javascript 可能不会访问结果响应的任何属性。这可确保 ServiceWorker 不会影响 Web 的语义,并防止因跨域泄露数据而引起的安全和隐私问题。

实际上,您从发出此类请求(将no-cors 指定为模式)得到的响应将不包含有关请求是成功还是失败的信息,从而使状态码为0。从您的@987654327 中删除mode @call 将显示 CORS 实际上失败了。

要了解 0 在您的特定情况下的含义,请查阅其他 SO 答案。

【讨论】:

谢谢,如果我删除“no-cors”:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'localhost:8888' 不允许访问。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。如何解决 CORS? 没错。 CORS 是一项浏览器安全功能,无法从页面本身禁用。如果您想通过浏览器请求他们的页面,您必须联系 baidu.com。 欢迎来到疯狂而美妙的 CORS 世界。一个必要的(?)邪恶; CORS 对 Web 开发人员来说是一个巨大的痛苦。

以上是关于为啥 fetch 返回 status = 0 的响应?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 mysqli_fetch_array() 返回数组大小的两倍? [关闭]

为啥 Fetch API 调用不返回响应标头?

为啥 PDO fetch() 只返回第一行? [复制]

我的 fetch 请求返回的数据不在我的数据库中,为啥?

JavaScript fetch API - 为啥 response.json() 返回一个 promise 对象(而不是 JSON)? [复制]

当我将 event.preventDefault() 与 fetch api、express 和 node.js 一起使用时,为啥 req.body 返回 null? [复制]