2012-11-30 131 views
0

我试图建立一个GET请求跨域。域A是目标,它有一个名为/服务的getUser:无法获取CORS的工作(NodeJS)

(...) 
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(); 
(...) 

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

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

我错过了什么?

预先感谢您的时间。

+0

简化这一点。使用curl或wget向'/ getUser'发出请求。它工作吗?可能不会,如果不是,则删除所有客户端问题。 – Brad

回答

1

?只在URI中有效,表示查询字符串的开头。在此之后,需要对其进行URL编码:

.../getUser?callback=%3f 

不过,虽然这可能通过浏览器的验证,但它仍然不是一个有效的“padding”为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

一些错误服务器端导致问题。我还修复了回调“?”问题,谢谢。 服务器端,我在看req.headers.origin。如果提供,我假设客户端正在使用CORS(_createCORSRequest())。否则,我看看req.headers.referer。然后我将该值与我的授权域列表 进行比较。如果授权,则继续发送错误。 这是确保只有授权域请求此服务的正确方法吗? 谢谢 –

0

我想推荐你我模块调用simpleS,它在一个非常简单的方式实现CORS,并与谷歌Chrome,Mozilla Firefox和Opera测试。它被设计为默认接受来自当前主机或本地文件系统源的请求。要接受来自其他来源的请求,你需要这样的事:上simples here

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

更多的文档。该模块仍在开发中,但您可以尝试一下。