美文网首页nodejs
node.js学习(4)——form提交数据(get)

node.js学习(4)——form提交数据(get)

作者: YINdevelop | 来源:发表于2018-09-15 17:27 被阅读21次

上一节-node.js学习(3)— http模块与fs模块综合

1.常用的提交数据方式

通常我们前台从后台请求数据的方式有form、ajax、jsonp等。但对于后台方式都一样,那就是接收请求,返回数据。当然在数据请求方式上细分,一般又分为psot、get。

get——提交的数据在url后面拼接。

post——数据不在url里面。

本节我们将通过前面所学的搭建node服务器,并在后台接收前台提交的数据。

2.form提交-字符串截取

Jietu20180915-153834.jpg

在form.html增加如下代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <form action="http://localhost:8080/aa" method=“get”>
        <ul>
            <li>
                账号:<input type="text" name="user">
            </li>
            <li>
                密码:<input type="password"" name="pass">
            </li>
            <li>
                <input type="submit" value="提交">
            </li>
        </ul>
    </form>
</body>
</html>
  • 本例使用get方法提交,form不加method指定提交方式,默认也为get;
  • action为提交数据地址,本例随便测试个地址http://localhost:8080/aa

输入账号密码点击提交,可以很明显的看见get方式使用明文提交,输入的数据在url后面拼接。

form.gif

不过这不是本节的重点,本节的目的是如何在后台拿到接收的数据。

我们在form.js增加下面代码:

const http=require('http');
http.createServer(function(req,res){
    if(req.url.indexOf('?')!=-1){
        const arr=req.url.split('?')[1];//arr[0]=>'/aa'  arr[1]=>'user=1&pass=1'
        const arr1=arr.split('&'); //['user=1','pass=1']
        let getData={}
        arr1.map((item,index)=>{
            const data=item.split('=');
            getData[data[0]]=data[1]
        })
        console.log(getData); //{ user: '1', pass: '1' }
    }
    res.write('aa');
    res.end();
}).listen(8080)
  • req.url为 /aa?user=1&pass=1,通过字符串截取,以及遍历等操作,可以在getData拿到前台提交的数据。
  • 代码中的if判断,是因为前面讲的谷歌浏览器 req.url会返回 /favicon.ico,导致因为没有?所无法截取而报错。

3.form提交-querystring(查询字符串)

前面我们使用split方法对字符窜进行截取,但实际工作过程中,这种方法显然太麻烦,不可取。所以当然有简便的办法。

使用node自带模块——querystring(将查询字符串解析成json对象)。

querystring.parse(str,sep,eq,options)

str为要查询的字符串;
sep用于界定字符串中的键值对的分隔符。默认为 '&'
eq用于界定字符串中的键与值的分隔符。默认为 '='。

举个🌰

var str=querystring.parse('uesr=1&pass=1&pass=2')
console.log(str) //{ user: '1', pass: [ '1', '2' ] }

注意:如果第二个参数不传,传第三个或者第四个,需要将其设为null;

下面我们更改上面的代码如下:

const http=require('http');
const querystring=require('querystring');
http.createServer(function(req,res){
    if(req.url.indexOf('?')!=-1){
        const arr=req.url.split('?')[1];
        let getData=querystring.parse(arr)
        console.log(getData); //{ user: '1', pass: '1' }
    }
    res.write('aa');
    res.end();
}).listen(8080)

是不是省去了很多代码。但代码看着还是麻烦,有没有更简单的?当然有。

4.form提交—url(解析url字符串)

前面我们使用querystring进行查询字符串解析成json对象。

下面我们使用node自带模块——url(将url解析成对象)

url.parse(url, parseQueryString, slashesDenoteHost)

url:为要解析的 URL 字符串。
parseQueryString:布尔值。默认为flase,如果为真,会调用querystring.parse生成json对象。
slashesDenoteHost:暂未用到,需要使用再去查询。

举个🌰

🌰1:

const url = require('url');
const str = url.parse('http://www.test.com/aa?name=1&pass=1');
console.log(str);

{
    protocol: 'http:',
    slashes: true,
    auth: null,
    host: 'www.test.com',
    port: null,
    hostname: 'www.test.com',
    hash: null,
    search: '?name=1&pass=1',
    query: 'name=1&pass=1',
    pathname: '/aa',
    path: '/aa?name=1&pass=1',
    href: 'http://www.test.com/aa?name=1&pass=1'
}

🌰2:

const str1 = url.parse('http://www.test.com/aa?name=1&pass=1', true);
console.log(str1);

    {
        protocol: 'http:',
        slashes: true,
        auth: null,
        host: 'www.test.com',
        port: null,
        hostname: 'www.test.com',
        hash: null,
        search: '?name=1&pass=1',
        query: {
            name: '1',
            pass: '1'
        },
        pathname: '/aa',
        path: '/aa?name=1&pass=1',
        href: 'http://www.test.com/aa?name=1&pass=1'
    }

经过上面的两个例子,我们可以很明显的看出来query属性已经被转化为对象。现在我们使用可以使用该方法愉快的简化我们之前的代码了。

修改后的代码如下:

const http = require('http');
const urlFormatter = require('url');  //url使用太多,使用urlFormatter,防止冲突
http.createServer(function (req, res) {
    const getData =urlFormatter.parse(req.url,true).query;
    console.log(getData); //{ user: '1', pass: '1' }、{}第二个为空是/favicon.ico后面没有查询字符串。
    res.write('aa');
    res.end();
}).listen(8080)

是不是又简化了很多。讲了这么多,get方式已经讲完了。下一节我们将对post方式进行讲解。

下一节-node.js学习(5)— form提交数据(post)

相关文章