使用 Eve 和 AngularJS 的 CORS 问题

Posted

技术标签:

【中文标题】使用 Eve 和 AngularJS 的 CORS 问题【英文标题】:Trouble with CORS using Eve and AngularJS 【发布时间】:2016-08-24 09:00:10 【问题描述】:

我正在使用 Eve 和 AngularJS 中的 API 开发应用程序。 为了避免 CORS 问题,我制作了一个简单的 NodeJS 服务器来提供我的静态文件。 但是,即使在通过编写'X_DOMAINS': '*'(我使用 Curl 测试并且它有效)允许我的 Python Eve API 上的所有域之后,当我想使用 $http 调用 API 时,我的浏览器中也遇到了问题。

这是我在 chrome 中遇到的错误:

XMLHttpRequest cannot load http://localhost:5000/regions. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access.

我什至在我的 Node 应用程序中写了这个,尽管我认为它没有用:

app.all('/*', function(req, res, next) 
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type");
  res.header("Access-Control-Allow-Methods", "GET, POST","PUT");
  next();
);

到目前为止没有任何效果,提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

在使用 javascript 时遇到了一些类似的问题。我可以在前夕通过一些调整让它运行,但最终还是不够。 BadRequest 响应由烧瓶引擎发送,而不是 eve,禁用任何处理错误的 javascript 尝试。似乎有一个很好的烧瓶扩展CORS 很好地涵盖了它:

from flask.ext.cors import CORS
....
CORS(app)

这就是我最终所需要的。

【讨论】:

在将导入从“flask.ext.cors”更改为“flask_cors”后,这对我有用。此外,由于我从这个答案中不清楚,所以 Eve app.run() 命令不会被这个取代,并且在之后仍然是必要的(至少它对我来说是)。您提供的链接对此很有帮助。【参考方案2】:

在以下命令中: res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type");

您设置了允许的标头,也许您发送了其他标头,例如“授权”,在这种情况下,您必须将这些标头包含在上述命令中

【讨论】:

【参考方案3】:

将此添加到您的响应标头中:

res.header("Access-Control-Allow-Origin", "http://localhost:8080");

删除以下内容:

http://localhost:8080

或者您可以尝试获取请求来源并将其添加到响应中。像这样的:

var hostName = req.get('host');
res.header("Access-Control-Allow-Origin", hostName);

在某些情况下它可能会起作用,特别是在它是 GET 调用的情况下。但是如果是 POST 的话,有些浏览器会屏蔽掉。

另一种选择是禁用浏览器上的网络安全,(尽管不是最好的做法。)您可以阅读here。

还可以浏览帖子here,以便您更好地了解问题。

【讨论】:

以上是关于使用 Eve 和 AngularJS 的 CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 CORS 的 Javascript 和 angularjs

AngularJS 和 Laravel - CORS

AngularJS 和 Silex 的 CORS 问题(PHP - Apache)

使用 nodejs、angularjs 和 paypal sdk 付款结果 cors 错误

使用 Django 和 CORS 的 AngularJS 应用程序中的 cookie 消失了

AngularJS $http、CORS 和 Jersey 的基本身份验证