nodeJs的表单数据解析2


表单中的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,我们会发现,这是一串字符串。

Post 查询

我们需要处理它。所以我们要引入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 查询成功

这时传过来的数据我们就可以处理了。

表单中的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();
    });
}

文章作者: 牟勇
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 牟勇 !
  目录