2012-02-17 163 views
0

我有以下的node.js服務器設置監聽端口9001如何通過HTTPS將AJAX請求發送到node.js服務器?

var https = require('https'); 
var fs = require('fs'); 
var qs = require('querystring');  
var options = { 
    key: fs.readFileSync('privatekey.pem'), 
    cert: fs.readFileSync('certificate.pem') 
}; 
https.createServer(options, function (req, res) { 
    res.writeHead(200); 
    console.log('Request Received!'); 
    console.log(req.method); 
    if (true || req.method == 'POST') { 
    var body = ''; 
    req.on('data', function (data) { 
     body += data; 
    }); 
    req.on('end', function() { 
     console.log(body); 
     var POST = qs.parse(body); 
     console.log(POST); 
    }); 
    } 
    res.end("hello, world\n"); 
}).listen(9001); 

,我試圖讓該服務器到AJAX響應號召

function form_save() 
{ 
    console.log("submitted!"); 
    var data_obj = { 
    data1: "item1", 
    data2: "item2" 
    } 
    $.ajax({ 
    url: 'https://adam.testserver.com:9001/', 
    type: "POST", 
    dataType: "json", 
    data: data_obj, 
    success: function() { 
     console.log("success!"); 
    }, 
    complete: function() { 
     console.log("complete!"); 
    } 
    }); 
} 

沒有與發生的兩個問題我的安排。第一個是,如果我啓動服務器,然後點擊觸發我的form_save按鈕()的節點服務器不響應,我得到以下錯誤:

submitted! 
OPTIONS https://adam.testserver.com:9001/ Resource failed to load 
jQuery.extend.ajaxjquery.js:3633 
$.ajaxjquery.validate.js:1087 
form_savew_worksheet.php:64 
confirm_deletew_worksheet.php:95 
jQuery.event.handlejquery.js:2693 
jQuery.event.add.handlejquery.js:2468 
w_worksheet.php:73 
complete! 

在這一點上,如果我訪問該網址directy( https://adam.testserver.com:9001/)我得到預期的「hello,world」輸出以及控制檯消息「Request Received! GET」。從這一點上,如果我點擊按鈕觸發我的AJAX呼叫,我會得到一個新的錯誤。

submitted! 
XMLHttpRequest cannot load https://adam.testserver.com:9001/. Origin 
https://adam.testserver.com is not allowed by Access-Control-Allow-Origin. 
w_worksheet.php:73 
complete! 

我不明白爲什麼我得到這個消息既是我的形式和節點服務器駐留在同一臺服務器上。感謝您抽出寶貴的時間閱讀,我非常感謝任何幫助。我已經被卡住了一段時間了!

回答

2

您已經遇到了Cross-Origin Resource Sharing(CORS)規範。

請注意輸出中的OPTIONSThe OPTIONS HTTP Verb被瀏覽器用來查詢網頁服務器的URL,而不是GET其內容或POST數據。

您的服務器未響應CORS請求上的正確標題數據,因此您的瀏覽器假定其無權訪問數據並拒絕GET或POST至該URL。

如果你真的想要讓世界上運行的是AJAX請求,你可以做同樣的事情到以下網站:

function handleOptions(request, response) { 
    response.writeHead(200, { 
     "Access-Control-Allow-Origin": "*", 
     "Access-Control-Allow-Method": "POST, GET, OPTIONS", 
     "Access-Control-Allow-Headers": request.headers["access-control-request-headers"] 
    }); 
    response.end(); 
} 

function server(request, response) { 
    if(request.method == "POST") { 
     handlePost(request, response); 
    } else if(request.method == "OPTIONS") { 
     handleOptions(request, response); 
    } else { 
     handleOther(response); 
    } 
} 
https.createServer(sslObj, server).listen(9001); 

您可以填寫詳細信息,以及是否應該單獨處理GET,依此類推(handleOther應爲您不支持的每種請求方法返回適當的錯誤代碼)。

+0

謝謝!這是很棒的信息,讓我重新開始運行。它的作品,但我很好奇,爲什麼這被認爲是交叉起源。是否因爲我提交的表單是坐在apache服務器上的,我試圖在節點服務器中處理它的數據?再次感謝您的幫助! – akronymn 2012-02-18 16:00:40

+0

對不起,延遲迴復。我認爲[這是爲什麼](http://www.w3.org/TR/cors/#access-control-allow-origin-response-hea#user-agent-security)。它看起來像所有的HTTPS請求都需要CORS,因爲SSL證書可能不同(因此由兩個獨立的邏輯實體正式運行)。 – 2012-02-20 17:12:06