2012-11-30 63 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 
}); 

更多的文檔。該模塊仍在開發中,但您可以嘗試一下。