不能让CORS工作(NodeJS)。

问题描述 投票:0回答:2

我想建立一个跨域的GET请求。A域是目标域,它有一个叫做getUser的服务。

(...)
server.get('/getUser', function(req, res) {
    console.log('Call received');
}
(...)

正如你所看到的,它并没有做什么,我只是想确保请求的到达。 A域有一个公共的js文件,它实现了对这个服务的调用。

function callDomainA(){
  var url = 'https://domainA.com/getUser?callback=?';

  var xhr = _createCORSRequest('GET', url);
  if (!xhr) {
    console.log('CORS not supported by browser, try jsonp');
    _doJSONP(url)
  }
else{
    xhr.onload = function() {
        console.log('Success : ' + JSON.stringify(xhr.responseText));
    };

    xhr.onerror = function() {
        console.log('ERROR : There was an error with the CORS request.');
    };
}

xhr.send();

return false;
}

function _doJSONP(){
   (...)
}


function _createCORSRequest(method, url) {
   var xhr = new XMLHttpRequest();

    if ("withCredentials" in xhr) 
        xhr.open(method, url, true);  // XHR for Chrome/Firefox/Opera/Safari.
    else if (typeof XDomainRequest != "undefined") {
        xhr = new XDomainRequest();  // XDomainRequest for IE.
    xhr.open(method, url);
 } 
 else 
    xhr = null;  // CORS not supported.

 return xhr;
}

然后我有B域,它从A域加载js脚本,然后执行callDomainA()函数。

<script src="https://domainA.com/domainApublicjsfile.js"    type="text/javascript"></script>
(...)
callDomainA();
(...)

当我在B域加载包含对A域的调用的页面,并触发对callDomainA()的调用时,代码检测到浏览器(Firefox)可以执行CORS,但我收到的头文件显示错误500和ns_error_dom_bad_uri。

我希望有这样的事情,因为我在A域没有做任何事情来接受CORS请求或任何东西,但让我担心的是,请求似乎没有到达服务,或者至少控制台.log()没有注册任何东西。

我是否遗漏了什么?

先谢谢你的时间。

node.js jsonp
2个回答
1
投票

? 在URI中只有效一次,以表示查询字符串的开始。在那之后,它需要被URL编码。

.../getUser?callback=%3f

但是,虽然这可能会通过浏览器的验证,但它仍然不是一个有效的" "。填充物"的JSONP。该 callback 应该指定将被调用并传递JSON响应的全局函数的名称。

function handleJSONPRequest(data) {
    // ...
}

function callDomainA(){
    var url = 'https://domainA.com/getUser?callback=handleJSONPRequest';

    // ...
}

callback=? 快捷键是一些库的功能,比如jQuery,它可以代替 ? 与生成函数的名称。它不被 XMLHttpRequest不过。

$.getJSON('.../getUser?callback=?');
// GET .../getUser?callback=jQuery18204235873776488006_1354320142256&...

0
投票

我想向你推荐我的模块,叫做 简单S它以一种非常简单的方式实现了CORS,并在Google Chrome、Mozilla Firefox和Opera上进行了测试。它被设计成默认接受来自当前主机或本地文件系统的请求。要接受来自其他来源的请求,你需要这样的东西。

var simples = require('simples');
var server = simples(80);

server.config({
    cors: {
        origins: ['domaina.com', 'domainb.com'] // ['*'] for requests from anywhere
    }
});

server.get('/getUser', function (request, response) {
    // Your application logic
});

更多关于simples的文档 此处. 该模块仍在开发中,但你可以尝试一下。

© www.soinside.com 2019 - 2024. All rights reserved.