表单中的Post请求解析
上一篇的最终代码如下
var http = require('http');
var url = require('url');
http.createServer(function (req, res) {
if (req.method == "GET") {
doGet(req, res);
} else if (req.method == "POST") {
doPost(req, res);
} else {
res.end();
}
}).listen(8000);
function doGet (req, res) {
var u = url.parse(req.url, true).query;
console.log(u);
res.writeHeader(200, {'Content-Type': 'text/html'});
res.write('<!doctype html>');
res.write('<meta charset="utf-8">');
res.write('<title>demo</title>');
res.write('<form method="post">');
res.write('user: <input type="text" name="user">');
res.write('pwd: <input type="password" name="pwd">');
res.write('<input type="submit" value="submit">');
res.write('</form>');
res.end();
}
function doPost (req, res) {
res.end();
}
在上一篇的基础上,我们开始对doPost()方法进行改写。在此之前我们将doGet()中的
var u = url.parse(req.url, true).query;
console.log(u);
注释
我们先试着传点数据并打印看看
现在我们在doPost()console.log(req)
打印一下req。
运行程序,在浏览器的input中输入点数据,并提交。
在控制台我们发现我们找不到传的数据。但数据一般都随着请求传输过来了。
现在我们绑定一个data事件,传入参数data,并打印一下data,代码如下。
function doPost (req, res) {
req.on('data', function(data){
console.log(data);
});
res.end();
}
打印结果会是一段Buffer,这说明数据传过来了,我们将Buffer后面的数据,通过计算器的进制转换,十六进制转换为十进制,然后将十进制的数据,带入Ascii表,不难发现,这些就是我们刚刚的数据。
我们知道,图片音频等数据很大,Buffer有限,所以数据一般是分割成字节后发送的。那么数据只接收一次就储存的话,肯定会不完整。所以我们为了能完整的接受所有数据,需要在doPost方法中声明一个空的变量,让变量在ondata事件中将data组合在一起。
function doPost (req, res) {
var formData = '';
req.on('data', function(data){
formData += data;
});
res.end();
}
但是res.end()的位置不合适,这样会导致我们的formData数据还未接收完毕,就结束了doPost()方法。这是不合理的。所以,我们还要再绑定一个end方法。用来判断整个事件结束后才执行res.end();
。
代码如下
function doPost (req, res) {
var formData = '';
req.on('data', function(data){
formData += data;
});
req.on('end', function(){
console.log(formData);
res.end();
});
}
这时打印formData,我们会发现,这是一串字符串。
我们需要处理它。所以我们要引入querystring模块。var qs = require('querystring');
然后使用querystring的parse方法对字符串进行格式化。转成对象。代码如下
function doPost (req, res) {
var formData = '';
req.on('data', function(data){
formData += data;
});
req.on('end', function(){
var obj =qs.parse(formData);
console.log(obj);
res.end();
});
}
打印结果如下
这时传过来的数据我们就可以处理了。
表单中的post请求解析的部分就到此结束了。:)
这里是本次的实验的代码,包含之前get部分。
var http = require('http');
var url = require('url');
var qs = require('querystring');
http.createServer(function (req, res) {
if (req.method == "GET") {
doGet(req, res);
} else if (req.method == "POST") {
doPost(req, res);
} else {
res.end();
}
}).listen(8000);
function doGet (req, res) {
// var u = url.parse(req.url, true).query;
// console.log(u);
res.writeHeader(200, {'Content-Type': 'text/html'});
res.write('<!doctype html>');
res.write('<meta charset="utf-8">');
res.write('<title>demo</title>');
res.write('<form method="post">');
res.write('user: <input type="text" name="user">');
res.write('pwd: <input type="password" name="pwd">');
res.write('<input type="submit" value="submit">');
res.write('</form>');
res.end();
}
function doPost (req, res) {
var formData = '';
req.on('data', function(data){
formData += data;
});
req.on('end', function(){
var obj =qs.parse(formData);
console.log(obj);
res.end();
});
}