【问题标题】:Setting Access-Control-Allow-Origin doesn't work with AJAX/Node.js设置 Access-Control-Allow-Origin 不适用于 AJAX/Node.js
【发布时间】:2016-09-12 22:00:57
【问题描述】:

我一遍又一遍地面临同样的错误:

XMLHttpRequest cannot load http://localhost:3000/form. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8000' is therefore not allowed access. The response had HTTP status code 404.

我已经阅读了无数类似的帖子,他们几乎都有相同的答案,即添加以下设置:res.setHeader('Access-Control-Allow-Origin', '*')。 这就是我一直在做的,但它仍然不起作用。 我在 localhost:8000 上提供了一个 angular.js 应用程序(当单击 btn 时调用 logsth()),我的节点在 localhost:3000 上工作。它们的外观如下:

app.controller('Contact', ['$scope', function($scope) {
    $scope.logsth = function(){
        var datas = {'may':'4','june':'17'};
        $.ajax({
          url: 'http://localhost:3000/form',
          method: 'POST',
          crossDomain: true,
          data: datas
        });
    };
}]);

还有我的节点:

var express = require('express');
var router = express.Router();
var app = express();

app.use(function (req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
    res.setHeader('Access-Control-Allow-Credentials', true);
    next();
});

app.post('/form', function(req, res){
    console.log("e-mail sent");
    res.send('yey');
});

module.exports = router;

这里没有太多代码,但现在我只想摆脱错误。

编辑:当我使用 app.use(...) 和 app.post(...) 并转到 localhost:3000/form 时,我收到 404 错误。但是当我使用 router.use(...) 和 router.post(...) 时,至少链接可以正常工作。此外,没有“允许来源”错误,但我确实得到:POST http://localhost:3000/form 404 (Not Found)。但是,当我转到 http://localhost:3000/form 时,它会显示响应和 console.log。我应该将其保留为路由器而不是应用程序吗?

【问题讨论】:

  • 打开您的网络控制台。是否正在发送 OPTIONS 请求?
  • 如果是,你看到你期待的标题了吗?
  • 您只需要 ACAO,其余的都是多余的,可能会导致问题。

标签: javascript ajax node.js


【解决方案1】:

只留下这一行对我有用:

res.setHeader('Access-Control-Allow-Origin', '*');

更新:

你可以尝试安装cors模块from npm

【讨论】:

  • 您好,我也遇到了同样的问题。请问我应该在哪个文件中添加这一行?
  • 是的@AnandRaj - 在初始化您的应用程序后的中间件中:var app = express(); app.use(function (req, res, next) { res.setHeader('Access-Control-Allow-Origin', '*'); next(); }); 这对您有用吗?
  • 不......我也测试过......当我在设备上运行项目时,它对我有用。但它不适用于浏览器
  • @AnandRaj - 如果你还需要它,你可以安装cors npm 模块:npmjs.com/package/cors
【解决方案2】:

问题是您返回通配符来源 (*) 并且 试图传递凭据 (res.setHeader('Access-Control-Allow-Credentials', true);)。你不能两者兼得。如果您必须使用Access-Control-Allow-Credentials,那么您需要在Access-Control-Allow-Origin 标头中明确说明允许的来源。

所以,要么删除这个:

res.setHeader('Access-Control-Allow-Credentials', true);

或者把原点改成这样:

res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');

【讨论】:

  • 尝试了这两个选项,但没有改变任何事情。
  • 我认为在这种情况下,源头需要设置为http://localhost:8000,因为源(浏览器中的页面)是8000,目标服务器是3000。
  • 谢谢,我也这么认为。更改了它,但错误仍然存​​在。
  • @tzolkin,您的开发工具的“网络”选项卡或Fiddler 之类的应用程序中的响应是什么样的?您应该会在响应中看到 Access-Control-Allow-Origin 标头。
  • 我只得到这行数据:form / POST / 404 not found
猜你喜欢
  • 2013-08-30
  • 2021-01-01
  • 2013-03-10
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 2015-06-17
  • 2015-10-29
  • 2017-07-31
相关资源
最近更新 更多