尝试调用API时,我收到了'Access-Control-Allow-Origin'标头

时间:2016-09-17 22:12:01

标签: angularjs api cors jsonp mean-stack

编辑:可能值得注意的是,我在GoDaddy域名注册,并通过屏蔽转发到我的Bitnami IP。我的堆栈都在同一台服务器上,这就是为什么我不理解这个问题的跨站点性质。或许我理解错了。请帮我理解这个错误。

我知道还有其他类似的线程,但我没有看到任何匹配的确切设置。

我有运行AngularJS网站的Amazon AWS EC2 Bitnami MEAN堆栈。我发布了一些外部用一些Python脚本收集到mongodb中的信息,然后我有一个JS API,通过端口3000成功发布了这个集合......所有这些都是我能说的标准。我只是学习这项技术而且非常新手。

因此,当我在Chrome中使用API​​ [URL]:3000 / api 时,我会看到JSON结果。这不是问题。

当我的Angular站点的控制器尝试在API URL上执行$ http GET时,Express会在我的putty控制台中记录并显示到Bitnami,我确实正在使用API​​。

但是。当我进行F12调试时,Chrome在页面上给出了这个甜蜜的错误:

XMLHttpRequest cannot load **URL**. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin **URL**' is therefore not allowed access.

对于所有虚假网址,我不熟悉stackoverflow,它标记为使用“超过2个网址”,因为我没有10分。

非常感谢您提前帮助我理解这个问题。

1 个答案:

答案 0 :(得分:1)

出现此错误的原因很简单,您正在将API调用作为与您的角度应用程序提供的域分开的域。 Chrome或任何其他浏览器通常会抛出CORS错误。

您需要做的是转到您的API并将运行角度应用程序的域列入白名单。我不确定它是如何在python中完成的,但在下面的NodeJS中我会做的。

var cors = require('cors');
corsOptions = {
  origin: [
    'http://www.127.0.0.1:5555',
    'http://www.any-other-site-to-access.com'
  ],
  credentials: true
};
app.use(cors(corsOptions));

对于python,这可能会有所帮助,但不确定 http://enable-cors.org/server_appengine.html

从CORS的文档中,启用所有CORS

var express = require('express')
  , cors = require('cors')
  , app = express();

app.use(cors());

app.get('/products/:id', function(req, res, next){
  res.json({msg: 'This is CORS-enabled for all origins!'});
});

app.listen(80, function(){
  console.log('CORS-enabled web server listening on port 80');
});