完全错误是这样的:
XMLHttpRequest无法加载http://ip:port/path。对预检的反应 请求未通过访问控制检查:否 '访问控制允许来源'标题出现在请求的上 资源。起源' http://localhost:3000'因此是不允许的 访问。
环境详情:
精疲力竭地尝试了几乎所有事情,但无法完成任务。
实际上我是从angular js客户端请求node.js服务器。我尝试了所有可能的选择。
流程就是这样:
我为此尝试了什么
expressjs/cors和 Solving "Access-Control-Allow-Origin" in localhost NodeJS + Express
客户端代码
$scope.testFunc = function () {
$("div#preloader").show();
$http.post(rtcControlUrl, data).success(function () {
$("div#preloader").hide();
if(response.success)
$.notify(response.msg, "success");
else $.notify(response.msg);
console.log(response.data);
}).error(function () {
$.notify("Request timeout!");
$("div#preloader").hide();
});
};
app.post("/path", cors(), function(req, res) {
shelljs.exec("bash test.sh",{silent:true,async:false}).output;
console.log(output);
res.json({"success": true, msg: 'some text', 'data' : output});
}
});
答案 0 :(得分:2)
错误消息显示对预检请求的响应。
如果您查找preflight request,您会看到使用OPTIONS方法。
"预检"请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求
您的代码:
app.post(" / path",cors()
...仅在POST请求中使用cors中间件。
您也需要处理OPTIONS请求。
答案 1 :(得分:1)
我通过将NPM Request Module与请求标头
一起使用来解决此问题{
name : 'content-type',
value: 'application/x-www-form-urlencoded'
}
现在我解决了这个问题,但没有在服务器端代码上设置任何标头。我分三步实现了这一目标。
客户
$scope.testFunction= function () {
$("div#preloader").show();
$http.get(url).success(function (response) {
$("div#preloader").hide();
if(response.success)
$.notify(response.msg, "success");
else $.notify(response.msg);
console.log(response.data);
}).error(function () {
$.notify("Request timeout!");
$("div#preloader").hide();
});
};
本地节点服务器
request({
url : url,
method : "POST",
json : true,
headers: [
{
name : 'content-type',
value: 'application/x-www-form-urlencoded'
}
],
body : data
}, function optionalCallback(err, response) {
if (err) {
console.error('**************[page][functionName][Request][Fail]*****************', err);
res.json({success: false, msg: 'msg', data: err});
} else {
var dataObj = (response && response.body) ? response.body.data : undefined;
console.info('*************************[pageName][functionName][Request][Success]**********************');
res.json({success: true, msg: 'msg', data: ''});
}
});
请记住本地节点服务器标头,方法与 this video
中描述的方式相同我正在执行最终业务逻辑的终端服务器。
var cors = require('cors');
app.options('*', cors());
app.post("/path", cors(), function(req, res) {
shelljs.exec("bash test.sh",{silent:true,async:false}).output;
console.log(output);
res.json({"success": true, msg: 'some text', 'data' : output});
}
});