NodeJS fetch(“ https://www.google.com”)说“ TypeError:尝试获取资源时出现NetworkError”,但它是200

时间:2020-03-31 23:48:44

标签: get cors axios

我的Firefox开发人员网络选项卡上说该呼叫是200,甚至显示了该页面,但是fetchaxios都说它由于网络错误而失败。

axios通话只是==>

    axios.get('https://www.google.com', {
        headers: {
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, HEAD, OPTIONS, PATCH'
        }
    }).then((response) => {
        alert(response); 
    }, (error) => { 
            alert("error = " + error); 
    }); 

这一定是简单/愚蠢的,但是我无法弄清楚。 :-(

哦,是的。 Edge做同样的事情。 。 。

(已编辑)更多详细信息

如果我在浏览器中添加一个UNBLOCK CORS扩展名并且注释掉我的两个标题行,则它可以工作。对于标题行,它不起作用-因此它们一定是错误的,但是我不知道如何。

axios.get('https://www.google.com', {
    headers: {
        // 'Access-Control-Allow-Origin': '*',
        // 'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, HEAD, OPTIONS, PATCH'
    }
}).then((response) => {

有效

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您已经发现,问题在于这是跨源请求,并且仅在CORS中允许。

但是,您似乎误解了CORS。

同源策略的重点是人们不应该执行您在此处尝试做的事情-在浏览器中将请求从域A的页面发送到域B的页面。 B (不是A!)明确允许从域A(或域*)接收请求。

因此,在您的情况下, Google (不是您)必须在响应中发送这些标头,以告知浏览器允许此请求,并且应该将结果返回到您的代码。当然,Google并没有这样做,所以即使它是200,您也永远不会得到结果,因为浏览器看到在200响应中缺少了CORS标头。

您无需依赖扩展即可禁用此机制(而不要求Google为您的域add添加例外)的唯一方法就是通过服务器代理此请求。如果您的 server 将请求发送到Google而不是页面中的脚本,则可以正常运行,因为这是 browsers 强制执行的策略,而服务器不是在浏览器中。因此,您必须向服务器发送一个请求,该请求会将其转发给Google,然后将来自Google的响应传递回页面中的代码。

尽管如此,您对发送请求的内容似乎有些困惑:在您的问题标题中,您写了“ NodeJS”(这意味着已经从服务器发送了该消息),但实际上您是从脚本发送请求的在浏览器中(这很明显,因为您谈论的是 Firefox 网络标签,并且使用了alert(在node.js中不存在),并且您还谈论了浏览器扩展),因此浏览器规则适用于您。

另请参阅:


注意:至于为什么使用Unblock CORS扩展并附加了这些标头(而不是仅忽略标头)失败的原因,我不确定,但这并不相关,因为在 request 这些标头充其量是无用的,反之则是无效的。