我正在构建一个Web服务器,在服务器端使用节点js,在客户端使用angular。
我在其他域上的不同域和客户端上运行服务器。
我的服务器端代码:
var express = require('express');
var app = express();
var http = require("http").createServer(app);
var request = require('request');
app.use(function(req, res, next) {
console.log(req.headers);
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept, Authorization");
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
next();
});
app.get('/api/hello', function(req, res){
var data = {'message': 'Server is running'}
res.jsonp(data);
});
http.listen(5000);
并在客户端(Angular)。
angular.controller('myController', function($state, $http){
$http.get('http://localhost:5000/api/hello').success(function(response, status) {
console.log(responce);
}).error( function(error, status) {
console.log(error)
});
});
我的服务器在端口5000上运行,而我的客户端在不同域上的端口4000上运行。
当我从客户端发送上述请求时,我在浏览器控制台中收到以下错误
XMLHttpRequest无法加载http://localhost:5000/api/hello。响应 预检请求没有通过访问控制检查:通配符 ' *'不能用于“访问控制 - 允许 - 来源”#39;标头时 凭证标志为真。起源' http://localhost:4000'是 因此不允许访问。
我对离子应用也有同样的问题。
这背后的原因是什么?
我从多个域以及移动和网络等不同应用程序访问这些API。
答案 0 :(得分:2)
您可以使用cors
,如下所示:
安装cors模块
npm install --save cors
服务器代码
var express = require('express');
var cors = require('cors');
var app = express();
app.use(cors());
// others code
<强>角强>
angular.controller('myController', function($state, $http){
$http
.get('http://localhost:5000/api/hello')
.then(function(response) {
console.log(responce);
}, function(error, status) {
console.log(error)
});
});
答案 1 :(得分:0)
在该错误中,好像您的Access-Control-Allow-Credentials
标题可能会返回为真?您的回复包含哪些标题?
在您添加标题时尝试添加res.header('Access-Control-Allow-Credentials', false);
,看看是否能解决该特定错误。
此外,您是否有理由包含http.createServer(app)代码? ExpressJS应用程序通常是通过直接调用app.listen
来启动的,这可能就是问题所在。
app.listen(5000, function () {
console.log('Example app listening on port 5000!');
});
答案 2 :(得分:0)
在路由中我创建了一个名为corsheaders.js的文件 其中包含
module.exports = function (req, res, next) {
if (allowedHosts.indexOf(req.headers.origin) > -1) {
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Methods', 'GET,POST,DELETE,OPTIONS,PUT');
res.header('Access-Control-Allow-Headers', 'Content-Type');
}
next();
};
这里的allowedHosts是一个包含我允许的域的数组,在app.js中我使用了这个文件
app.use(require('./routes/corsheaders'));