我正在使用AJAX POST
数据到使用 Node.js 代码的服务器。非常简单,这个测试项目中有两个文件。这是main.html
:
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<script>
var xhr = new XMLHttpRequest();
xhr.open('POST', '/', true);
xhr.send('hello');
</script>
</body>
</html>
这里是服务器代码:
const http = require('http');
http.createServer(function(req,res) {
console.log(req.body);
}).listen(3000);
也许,您知道服务器将console.log()
&#39;未定义&#39;。
所以问题是为什么它未定义&#39;?如何在服务器上获取AJAX数据?
根据this question我知道其他解决方案。
你可以帮助我方便地获取数据吗?
答案 0 :(得分:3)
你已经创建了服务器,但有两个问题:
POST
,因此您需要正确解析POST
个请求(不能完全解决您的问题,但您需要区分请求方法)。POST
正文,您需要通过使用querystring
模块告诉它如何完成。将它们结合在一起:
var qs = require('querystring');
http.createServer(function(req, res) {
if (request.method == 'POST') {
var body = '';
request.on('data', function(data) {
body += data;
});
request.on('end', function() {
var post = qs.parse(body);
// Use your POST here
console.log(post);
});
}
}).listen(3000);
JSON数据 - 清洁解决方案:
您需要使用JSON
对AJAX数据进行编码,然后在服务器端解析它,如下所示:
http.createServer(function(req,res) {
if (req.method == 'POST') {
var jsonPost = '';
req.on('data', function(data) {
jsonPost += data;
});
req.on('end', function() {
var post = JSON.parse(jsonPost);
// Use your POST here
console.log(post);
});
}
}).listen(3000);
使用 Express.js 框架,使用bodyParser
模块,你会更好。
更新 - 如何缓冲块:
考虑简单示例 - 在xhr.send()
中发送超过Content-Length
的 LARGE 数量的文本。在data
事件上执行以下操作:
req.on('data', function(data) {
console.log(data);
body += data;
});
你会看到类似的东西:
<Buffer 0a 0a 4c 6f 72 65 6d 20 69 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74 2c 20 63 6f 6e 73 65 63 74 65 74 75 72 20 61 64 69 70 69 73 63 69 ... >
<Buffer 65 74 20 71 75 61 6d 20 63 6f 6e 67 75 65 20 6c 6f 62 6f 72 74 69 73 2e 20 50 65 6c 6c 65 6e 74 65 73 71 75 65 20 74 65 6d 70 75 73 20 75 6c 6c 61 6d ... >
<Buffer 61 2e 20 56 69 76 61 6d 75 73 20 76 69 74 61 65 20 61 6e 74 65 20 6d 65 74 75 73 2e 20 4d 61 75 72 69 73 20 71 75 69 73 20 61 6c 69 71 75 65 74 20 65 ... >
这表明在data
事件中以块的形式收到的数据。仅在end
事件中,您将获得发送的所有数据(如果您在此之前汇总了它)。 Node.js不处理这个问题,这就是你需要第三方模块的原因。
也就是说 - 您不能只获得req.body
请求,因为根本没有设置。