Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 设置访问控制允许原点不';t使用AJAX/Node.js_Javascript_Ajax_Node.js - Fatal编程技术网

Javascript 设置访问控制允许原点不';t使用AJAX/Node.js

Javascript 设置访问控制允许原点不';t使用AJAX/Node.js,javascript,ajax,node.js,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

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

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/表单时,我得到404错误。但是当我使用router.use(…)和router.post(…)时,至少链接可以正常工作。此外,没有“允许源代码”错误,但我确实得到:
POSThttp://localhost:3000/form 404(未找到)
。但是,当我转到它时,它会显示响应和console.log。我是否应该将其保留为路由器而不是应用程序?

问题是您正在返回通配符源(
*
)并尝试传递凭据(
res.setHeader(
Access-Control-Allow-credentials',true);
)。你不能两者兼而有之。如果必须使用
访问控制允许凭据
,则需要在
访问控制允许来源
标题中明确说明允许的来源

因此,要么删除此项:

res.setHeader('Access-Control-Allow-Credentials', true);
或将原点更改为:

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

只需留下这一行,我就成功了:

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


您可以尝试安装
cors
模块。

打开网络控制台。是否发送了选项请求?如果是,您是否看到了预期的标题?您只需要ACAO,其余的是多余的,可能会导致问题。尝试了两个选项,但没有改变任何内容。我认为需要将原始标题设置为
http://localhost:8000
在这种情况下,从原点开始(浏览器中的页面)是8000,目标服务器是3000。谢谢,我也这么认为。更改了它,但错误仍然存在。@tzolkin,在开发工具的“网络”选项卡或类似的应用程序中,响应是什么样子的?你应该在响应中看到
访问控制允许源代码
标题。我只得到这一行数据:form/POST/404 not foundHi,我面临同样的问题。你能告诉我应该在哪个文件中添加这一行吗?是@AnandRaj-在初始化你的应用程序后在中间件中:
var app=express();使用(函数(req,res,next){res.setHeader('Access-Control-Allow-Origin','*');next();})对你有用吗?不。。。我也测试过。。。。当我在设备上运行项目时,它为我工作。但它不工作browser@AnandRaj-如果您仍然需要,可以安装
cors
npm模块: