角度/节点CORS问题

时间:2016-06-06 06:24:53

标签: javascript angularjs node.js ionic-framework cors

我正在构建一个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。

3 个答案:

答案 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'));