我使用Node / Express创建了一个小API并尝试使用Angularjs来提取数据,但是当我的html页面在localhost:8888上的apache下运行并且节点API在端口3000上侦听时,我得到了No'Access-Control-允许来源 . 我尝试使用node-http-proxy和Vhosts Apache但没有取得多大成功,请参阅下面的完整错误和代码 .
“XMLHttpRequest无法加载localhost:3000 . 请求的资源上没有'Access-Control-Allow-Origin'标头 . 因此不允许来自”localhost:8888“ . ”
// Api Using Node/Express
var express = require('express');
var app = express();
var contractors = [
{
"id": "1",
"name": "Joe Blogg",
"Weeks": 3,
"Photo": "1.png"
}
];
app.use(express.bodyParser());
app.get('/', function(req, res) {
res.json(contractors);
});
app.listen(process.env.PORT || 3000);
console.log('Server is running on Port 3000')
// Angular code
angular.module('contractorsApp', [])
.controller('ContractorsCtrl', function($scope, $http,$routeParams) {
$http.get('localhost:3000').success(function(data) {
$scope.contractors = data;
})
// HTML
<body ng-app="contractorsApp">
<div ng-controller="ContractorsCtrl">
<ul>
<li ng-repeat="person in contractors">{{person.name}}</li>
</ul>
</div>
</body>
10 回答
另一种方法是简单地将 Headers 添加到您的路线:
你可以使用“$ http.jsonp”
要么
以下是针对本地测试使用chrome的方法
您需要使用以下命令打开chrome . (按窗口R)
注意:您的chrome不能打开 . 运行此命令时,chrome将自动打开 .
如果要在命令提示符下输入此命令,请选择chrome安装目录,然后使用此命令 .
下面是MAC中打开chrome的脚本代码,带有“--allow-file-access-from-files”
第二种选择
您可以使用open(1)添加标志:open -a 'Google Chrome' --args --allow-file-access-from-files
在项目中安装cors依赖项:
将以下内容添加到服务器配置文件中:
它适用于我的2.8.4 cors版本 .
接受的答案很好,如果你喜欢更短的东西,你可以使用一个名为 cors 的插件,可用于Express.js
对于这种特殊情况,它使用起来很简单:
尝试将以下中间件添加到您的NodeJS / Express应用程序中(为方便起见,我添加了一些注释):
希望有所帮助!
答案代码仅允许localhost:8888 . 此代码无法部署到 生产环境 环境,或者不同的服务器和端口名称 .
要使其适用于所有来源,请使用此代码:
top answer对我来说很好,除了我需要将多个域列入白名单 .
此外,最佳答案还有一个事实,即
OPTIONS
请求不是自动获取的 .我将列入白名单的域列为
allowed_origins
,并且根据origin
标头放置正确的域,因为Access-Control-Allow-Origin
不允许指定多个域 .这就是我最终得到的结果: