【问题标题】:Angular / Node CORS Issue角度/节点CORS问题
【发布时间】:2016-10-05 16:02:35
【问题描述】:

我正在构建一个 web 应用程序,在服务器端使用 node 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。回复 预检请求未通过访问控制检查:通配符 '*' 不能在 'Access-Control-Allow-Origin' 标头中使用 凭据标志为真。原点“http://localhost:4000”是 因此不允许访问。

我对 ionic 应用也有同样的问题。

这背后的原因可能是什么?

我正在从多个域以及移动和网络等不同应用程序访问这些 API。

【问题讨论】:

  • 飞行前请求使用'options' 动词而不是'get',因此您需要一个处理程序。您提出的特定请求(可能是自定义标头)有一些东西会强制使用 'options' 预检。
  • 尝试使用 Access-Control-Allow-Origin 标头成为特定域。
  • 请参阅 How to enable CORS in Express 以获得 OPTIONS 支持。
  • @jfriend00 我查看了您的第一条评论,但我没有设置任何自定义标题。
  • @nitinmegamind 看来你可能正面临这个问题:stackoverflow.com/questions/10883211/…

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


【解决方案1】:

您可以使用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)
       });
});

【讨论】:

  • 我仍然收到 CORS 错误。这个解决方案对我不起作用。尝试在角度上做同样的事情。但没有成功。
【解决方案2】:

在路由中,我创建了一个名为 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'));

【讨论】:

    【解决方案3】:

    在该错误中,您的 Access-Control-Allow-Credentials 标头可能会返回为 true?您的回复包含哪些标题?

    在添加标题时尝试添加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!');
    });
    

    【讨论】:

    • 您的预检正在到达服务器(或某处的服务器),因为它正在从预检请求(OPTIONS 请求)接收某种形式的标头。此请求收到哪些标头?您可以在检查器中找到此信息。在浏览器中直接访问http://localhost:5000/api/hello也会返回什么?
    • 请求标头:OPTIONS /api/hello HTTP/1.1 主机:localhost:5000 连接:保持活动访问控制请求方法:POST 来源:localhost:4000 Access-Control-Request-Headers : accept, content-type Accept: / Referer: localhost:4000 Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8
    • 响应头:HTTP/1.1 200 OK X-Powered-By: Express Access-Control-Allow-Origin: * Access-Control-Allow-Headers: Origin, X-Requested-With, Content-类型、接受、授权访问控制允许方法:GET、PUT、POST、DELETE、PATCH、OPTIONS 访问控制允许凭据:false 允许:GET、HEAD、POST、PUT 内容类型:text/html; charset=utf-8 内容长度:17 ETag:W/"11-UunX7iLX/fl1v0lmwRZzlA" 日期:星期一,2016 年 6 月 6 日 08:38:49 GMT 连接:保持活动
    • 是的,不确定。这一切看起来都很好。我建议的唯一另一件事是检查您的浏览器中是否缓存了来自浏览器可能尝试发送的其他项目的任何 cookie 或基于身份验证的内容?否则不确定......否则祝你好运!
    • @IanBelcher 这似乎是一个“使用本地主机作为来源问题”..stackoverflow.com/questions/10883211/…
    猜你喜欢
    • 2020-05-31
    • 2018-03-19
    • 1970-01-01
    • 2013-03-29
    • 2016-07-15
    • 1970-01-01
    • 2015-02-20
    • 2020-03-02
    • 2021-12-21
    相关资源
    最近更新 更多