我有以下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!
我不明白为什么我收到此消息,因为我的表单和节点服务器都驻留在同一台服务器上。感谢您抽出宝贵时间阅读,感谢您对此有任何帮助。我已经被困了一段时间了!
答案 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
应为您不支持的每种请求方法返回相应的错误代码。)