从localhost向远程服务器发出请求获取预检请求' Access-Control-Allow-Origin'

时间:2017-01-05 13:38:03

标签: javascript angularjs node.js express

完全错误是这样的:

  

XMLHttpRequest无法加载http://ip:port/path。对预检的反应   请求未通过访问控制检查:否   '访问控制允许来源'标题出现在请求的上   资源。起源' http://localhost:3000'因此是不允许的   访问。

环境详情:

精疲力竭地尝试了几乎所有事情,但无法完成任务。

实际上我是从angular js客户端请求node.js服务器。我尝试了所有可能的选择。

流程就是这样:

  1. 从以角度js设计的门户网站发起的请求。
  2. 点击远程计算机上的node.js服务器。
  3. 我为此尝试了什么

    expressjs/corsSolving "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});
                }
        });
    

2 个答案:

答案 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});
            }
    });