nodeJs之表单数据解析1


表单中的Get请求解析

先创建一个node.js的服务器,代码如下:

var http = require('http');

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);

console.log('server is running at http://localhost:8000');


function doGet (req,res) {
    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();
}

将其保存为server.js

我们通过判断浏览器request的方法menthod是Get还是Post,进行不同的处理。浏览器(客户端)打开的时候默认是Get方法进行的请求,此时服务器发送一个表单(‘html5中部分标签可省略’)给客户端。

接着我们在浏览器中输入http://localhost:8000,检测程序是否出错,如果出现如下截图,说明程序运行正常。

表单测试

接着我们在server.js的最前面引入url模块相关代码如下。
var url = require('url');

然后在地址栏输入/?name=zhangshan&pwd=aaa,在doGet()中添加代码,doGet()修改后的代码为:

function doGet (req, res) {
    var u = url.parse(req.url);
    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();
}

我们在控制台会得到如下输出

Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: ‘?name=zhangshan&pwd=aaa’,
query: ‘name=zhangshan&pwd=aaa’,
pathname: ‘/‘,
path: ‘/?name=zhangshan&pwd=aaa’,
href: ‘/?name=zhangshan&pwd=aaa’ }
Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: null,
query: null,
pathname: ‘/favicon.ico’,
path: ‘/favicon.ico’,
href: ‘/favicon.ico’ }

分析后我们可以发现,这和nodejs官网中关于url模块给出的示例不同,经过一系列的研究才知道官网的代码如果要进行实践应该如此:

var eg = 'http://user:pass@host.com:8080/p/a/t/h?query=string#hash';
console.log(url.parse(eg).href);
console.log(url.parse(eg).protocol);
console.log(url.parse(eg).slashes);
console.log(url.parse(eg).auth);
console.log(url.parse(eg).host);
console.log(url.parse(eg).hostname);
console.log(url.parse(eg).port);
console.log(url.parse(eg).search);
console.log(url.parse(eg).query);
console.log(url.parse(eg).hash);

我们运行上面的代码片段的话会得到如下输出。
示例
是不是与官网相同了?

回到主题。

我们知道url.parse(req.url)后拥有这些

search: ‘?name=zhangshan&pwd=aaa’,
query: ‘name=zhangshan&pwd=aaa’,
pathname: ‘/‘,
path: ‘/?name=zhangshan&pwd=aaa’,
href: ‘/?name=zhangshan&pwd=aaa’

我们就可以直接调用了。例如我想获取query的值就用u.query或者直接url.parse(req.url).query调用;
我们可以看到查询
现在我想获取name的值,我只需要将url.parse()的第二个值改为true即可代码如下:
url.parse(req.url, true).query
可以得到如下结果查询成功
得到了jsno数据后我们就可以存入数据库或者使用它了。

表单中的get请求解析的部分就到此结束了,关于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();
}

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