如何通过HTTPS向node.js服务器发送AJAX请求?

时间:2012-02-17 17:35:21

标签: ajax node.js https ssl

我有以下node.js服务器设置侦听端口9001

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!

此时如果我访问该url 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!

我不明白为什么我收到此消息,因为我的表单和节点服务器都驻留在同一台服务器上。感谢您抽出宝贵时间阅读,感谢您对此有任何帮助。我已经被困了一段时间了!

1 个答案:

答案 0 :(得分:2)

您已经遇到了Cross-Origin Resource Sharing(CORS)规范。

请注意输出中的OPTIONS。浏览器使用The OPTIONS HTTP Verb来查询网络服务器关于网址,而不是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应为您不支持的每种请求方法返回相应的错误代码。)