设置Access-Control-Allow-Origin不能与AJAX / Node.js一起使用

时间:2015-05-13 20:49:27

标签: javascript ajax node.js

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

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(...)时,至少链接工作正常。此外,没有“允许来源”#39;错误,但我得到:POST http://localhost:3000/form 404 (Not Found)。但是,当我转到http://localhost:3000/form时,它会显示响应和console.log。我应该把它作为路由器而不是应用程序吗?

2 个答案:

答案 0 :(得分:1)

离开这一行是我的诀窍:

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

<强>更新

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

答案 1 :(得分:0)

问题是您正在返回通配符来源(*尝试传递凭据(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');