美文网首页
GET表单提交/POST表单提交/数据交互/ node 垃圾回收

GET表单提交/POST表单提交/数据交互/ node 垃圾回收

作者: 子心_ | 来源:发表于2019-07-09 09:35 被阅读0次

GET表单提交

    <form action="http://localhost:8087/2.html" method="get">
        姓名:<input type="text" name="name" value='aaaa'>
        密码:<input type="password" name="pass" value='2222'>
             <input type="submit" value='提交'>
    </form>
    在node开启的服务器中使用req.url即可获得如下数据
        /2.html?name=aaaa&pass=2222
    使用url模块解析req.url           
    // let url = url.parse(req.url,true)//解析后获得url对象,加true后解析成JSON
    // url.query 可获得数据的JSON
    // url.pathname 可获得路径
    // 使用解构赋值 let {pathname,query} = url.parse(req.url,true);

POST表单提交

    //POST方法传输的数据通常很大,所以我们会把大的数据包切成许多小包.
    //因为HTTP基于TCP协议传输数据,可信度极高,所以不需要判断数据正确性.
    //此处需要使用querystring模块将接收完整的数据进行parse(解析),成为JSON格式
    //querystring的parse只是解析数据的部分,而url的parse是解析整个url.
    const qs = require('querystring')
    let str;//初级用法,后期优化;
    使用req.on('data',data=>{//接收数据包
            str+=data;
        });
    使用req.on('end',()=>{ //表明接收数据完成
            qs.parse(str);
        }); 

同时处理get与post请求

    const http = require('http');//http模块
    const url = require("url");//url模块
    const qs = require('querystring');//qs模块
    let server = http.createServer((req,res)=>{
        //get
        let {pathname,query} = url.parse(req.url,true);
        //post
        let str;//初级用法,后期优化;
        req.on('data',data=>{//接收数据包
            str+=data;
        });
        req.on('end',()=>{ //表明接收数据完成
            let post = qs.parse(str);
            console.log(pathname,query,post)
        }); 

    })
    server.listen(8087);

数据交互

index.js
    const server = require("./server"); 
    const router = require('./router');
    const reqHand = require('./requestHandlers');
    server.start(router.route);//使用服务器模块的start方法
server.js
    // 服务器模块
    const http = require('http');//http模块
    var url = require("url");//获取路径模块
    const qs = require('querystring');
        function start(route){
            let users={}
            function onHttp(req,res){
                let {pathname,query} = url.parse(req.url,true);
    
                let str;//初级用法,如果上传了图片等二进制文件,就会出错;所以实际应该用arr[]数组接收数据,然后拼接给Buffer;25号笔记中更新
                req.on('data',data=>{//接收数据包
                    str+=data;
                });
                req.on('end',()=>{ //表明接收数据完成
                    let post = qs.parse(str);
                    console.log(pathname,query,post);
                    route(pathname,res,query,users)//数据交给路由
                }); 
            }
            http.createServer(onHttp).listen(8087)//创建服务与监听端口
        }
        exports.start = start;
router.js
    // 路由模块
    const fs = require('fs');
    function route(pathname,res,query,users){
        let{name,pass} = query;
        switch(pathname){
            case '/reg':
            console.log("sssssssss");
                if(!name){
                    res.write('{"err":"1","msg":"name null"}');
                }else if(!pass){
                    res.write('{"err":"1","msg":"pass null"}');
                }else if(!/^\w{8,32}$/.test(name)){
                    res.write('{"err":"1","msg":"name miss"}');
                }else if(/^['|"]$/.test(pass)){
                    res.write('{"err":"1","msg":"pass miss"}');
                }else if(users[name]){
                    res.write('{"err":"1","msg":"name exist"}');
                }else {
                    users[name]=pass;
                    res.write('{"err":"0","msg":"success"}');
                }
                res.end();
            break;
            case '/login':
                if(!name){
                    res.write('{"err":"1","msg":"name null"}');
                }else if(!pass){
                    res.write('{"err":"1","msg":"pass null"}');
                }else if(!/^\w{8,32}$/g.test(name)){
                    res.write('{"err":"1","msg":"name miss"}');
                }else if(/^['|"]$/g.test(pass)){
                    res.write('{"err":"1","msg":"pass miss"}');
                }else if(!users[name]){
                    res.write('{"err":"1","msg":"no this name"}');
                }else if(users[name]!=pass){
                    res.write('{"err":"1","msg":"name or pass is incorrect"}');
                }else{
                    res.write('{"err":"0","msg":"success"}');
                }
                res.end();
            break;
            default:
                fs.readFile(`www${pathname}`,(err,data)=>{
                    if(err){
                        res.writeHeader(404);
                        res.write('Not Found');
                    }else{
                        res.write(data);
                    }
                    res.end();//数据完成
                });
        }
    }
    exports.route = route;

HTML

  <script type="text/javascript">
        $(function (){
            $('#btn1').click(function (){
                $.ajax({
                    url:'/reg',
                    data:{name:$("#name").val(),pass:$("#pass").val()},
                    dataType:'json',
                    success(data){
                        if(data.err != 0){
                            // alert(data.msg)
                            alert("成功的错"+data.msg);
                        }else{
                            alert("成功");
                        }
                    },
                    error(e){
                        alert(e.error);
                    }
                })   
            })
        })
    </script>
    </head>
    <body>
            姓名:<input type="text" id="name" >
            密码:<input type="password" id="pass" >
            <input type="button"  id="btn1" value="注册">
            <input type="button"  id="btn2" value="登陆">
    </body>

数据库

数据库分类
    1.关系型数据库 :mysql oracle
    mysql 性能,安全性都不错,免费,容灾能力略差
    oracle
    性能,安全性都不错,收费,容灾能力极好
    2.文件型数据库 :sqlite
    3.文档型数据库 :MongoDB

扩展

阻塞IO与非阻塞IO
    阻塞IO与非阻塞IO的工作效率没有区别,node用的非阻塞IO
    非阻塞IO使用回调函数,异步执行.所以程序执行过来的时候不会等待.
    阻塞IO,因为程序需要等待回应,所以会导致整个程序卡住.
前端加密后后台再次进行校验
    加密解密通常使用RSA算法,RSA为一类算法的统称.
    前台加密后,后台解密再校验.        
离散数学推荐一本书,蓝皮,同济大学出版.

node 垃圾回收机制(gc)
    在没有垃圾回收机制的语言中(c语言),内存需要自己释放,如果忘记释放就会造成内存泄露,泄露太多,(内存被垃圾占满),程序就没办法运行了.
缓冲池
    将最近,最长使用的资源(文件,数据),直接留在内存中.
    需要研究策略来,提高缓冲命中率
    缓冲命中率:用户访问资源的次数与该资源来自缓冲池的次数的比(例如100:30)
    比例越高,命中率越高,该缓冲池越好.

相关文章