我的Firefox开发人员网络选项卡上说该呼叫是200,甚至显示了该页面,但是fetch
和axios
都说它由于网络错误而失败。
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) => {
有效
有什么想法吗?
答案 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 这些标头充其量是无用的,反之则是无效的。