为什么fetch返回status = 0的响应?

时间:2016-10-21 17:57:05

标签: javascript ajax frontend

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

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。但是获取res返回:

enter image description here

为什么状态是什么?如何获得正确的资源,就像镀铬新工作中的那样?

2 个答案:

答案 0 :(得分:11)

config.mode的{​​{3}}部分:

  

no-cors - 防止该方法不是HEAD,GET或POST。如果任何ServiceWorkers拦截这些请求,他们可能不会添加或覆盖除这些之外的任何标头。此外,JavaScript可能无法访问生成的Response的任何属性。这可确保ServiceWorkers不会影响Web的语义,并防止因跨域泄漏数据而导致的安全和隐私问题。

实际上,从发出此类请求(将no-cors指定为模式)获得的响应将不包含有关请求是成功还是失败的信息,使状态代码为0.删除mode来自您的fetch电话会显示CORS实际上已失败。

要找出在您的特定情况下0意味着什么,请参考其他SO答案。

答案 1 :(得分:0)

我不知道如何在浏览器环境中执行此操作,但我知道它可以从Node中的跨源站点fetch获得。

require('es6-promise').polyfill();
require('isomorphic-fetch');
fetch('https://www.baidu.com', {
  mode: 'no-cors'
})
  .then((res) => {
    console.log(res.status); //=> 200
  });

因此,您可以使用节点服务器fetch将您想要的内容,然后respond添加到您的客户端。

我还想从浏览器中的某些网站fetch获取某些内容,这似乎是不可能的。也许真的无法做到这一点,因为互联网需要保护那些我们想从中获取资源的网站。