PID对应...">
美文网首页
node.js的Http系统模块使用

node.js的Http系统模块使用

作者: Maiiiiiiiiiiiid | 来源:发表于2019-05-05 10:18 被阅读0次

    Http系统模块使用

    [TOC]


    const http = require('http');
    
    var server = http.createServer(function () {
        console.log("有人来了")
    })
    
    //监听--wait
    //端口
    server.listen(8080)
    
    const http = require('http');
    var server = http.createServer(function (req,res) {       //request 请求  response 响应
        console.log('端口2222: ');
        console.log(req.url);
        switch (req.url) {
            case '/1.html':
                res.write("11111111");
                break;
            case '/2.html':
                res.write("11111111");
                break;
            default:
                res.write("404");
                break;
        }
    res.end();
    })
    //监听--wait
    //端口
    server.listen(2222);
    

    netstat -ano|findstr "端口号"

    E:\code\web\node_js>netstat -ano|findstr 1111
      TCP    0.0.0.0:1111           0.0.0.0:0              LISTENING       4212
      TCP    [::]:1111              [::]:0                 LISTENING       4212
    
    E:\code\web\node_js>netstat -ano|findstr 1112
      TCP    0.0.0.0:1112           0.0.0.0:0              LISTENING       4888
      TCP    [::]:1112              [::]:0                 LISTENING       4888
    
    E:\code\web\node_js>netstat -ano|findstr 2222
      TCP    0.0.0.0:2222           0.0.0.0:0              LISTENING       12140
      TCP    [::]:2222              [::]:0                 LISTENING       12140
    
    E:\code\web\node_js>netstat -ano|findstr 8080
      TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       5828
      TCP    [::]:8080              [::]:0                 LISTENING       5828
    

    任务管理器 ->PID对应查看

    [图片上传失败...(image-891312-1557021549325)]

    或者使用命令行查看:tasklist|findstr PID

    E:\code\web\node_js>tasklist|findstr 5828
    node.exe                      5828 Console                    4     22,872 K
    

    taskkill /f /t /im 进程名称 (根据进程名称结束进程)

    E:\code\web\node_js>taskkill /f /t /im node.exe
    成功: 已终止 PID 5828 (属于 PID 7952 子进程)的进程。
    成功: 已终止 PID 4212 (属于 PID 14960 子进程)的进程。
    成功: 已终止 PID 4888 (属于 PID 10284 子进程)的进程。
    成功: 已终止 PID 12140 (属于 PID 6360 子进程)的进程。
    

    如此一来:node.exe占用的所有的端口都会被结束进程

    文件系统

    文件操作-读与写

    const fs = require('fs');
    // fs.readFile('aaa.txt',function (err,data) {
    //     if (err) {
    //         console.log('读取失败');
    //     }else{
    //         console.log(data.toString());
    //     }
    // });
    fs.writeFile("bbb.txt","asfdddddd",*function*(*err*) {
        console.log(err); 
    });
    

    配合http系统

    const http = require('http');
    const fs = require('fs');
    
    let server = http.createServer(function (req, res) {
        //req.url => 'index.html'
        //读取 => '.www/index.html'
        //'./www/' + req.url
        var file_name = './www' + req.url;
        fs.readFile(file_name,function(err,data) {
            console.log(file_name);
            if(err){
                res.write("404");
            }else{
                res.write(data);
            }
            res.end();
        });
    });
    
    server.listen(8080);
    
    

    这种方式 在服务还在运行的时候再添加文件,即使服务不用重启客户端也可以访问的到

    http数据解析

    前台 -> 后台 form ,ajax ,jsonp
    对后台来说传过来的数据都一样
    前台 <--http协议--> 后台

    请求方式
    GET 在url中 跳转

    POST: 不在url中

    header:头信息                   <32K
    content:POST数据                 1G
    
    POST数据很大,分段传输
    

    GET方式:

    ​ (实际上对url做出处理)

    • querystring
    querystring.parse('user=maid&pass=123');    //'user=maid&pass=123'  =>  { user: 'maid', pass: '123' }
    
    const http = require('http');
    const querystring = require('querystring');
    
    let server = http.createServer(function (req, res) {
        
        let GET = {};
        let url = req.url;
    
        
        if(req.url.indexOf("?") != -1){
            let arr = req.url.split('?'); //        ['/aaa','user=maid&pass=123']
            url = arr[0];
            GET = querystring.parse(arr[1]);    //'user=maid&pass=123'  =>  { user: 'maid', pass: '123' }
        }
        console.log(url,GET);
    
    
        res.write(GET.user + ": 你好");
        res.end();
    
    }).listen(8080);
    
    
    • url
    const urlLib = require('url');
    let obj = urlLib.parse("http://localhost:8080/aaa?user=maid&pass=123");
    
    console.log(obj)
    /*输出
    Url {
      protocol: 'http:',
      slashes: true,
      auth: null,
      host: 'localhost:8080',
      port: '8080',
      hostname: 'localhost',
      hash: null,
      search: '?user=maid&pass=123',
      query: 'user=maid&pass=123',
      pathname: '/aaa',
      path: '/aaa?user=maid&pass=123',
      href: 'http://localhost:8080/aaa?user=maid&pass=123' }
    [Finished in 0.3s]
    */
    

    所以上面的可以这样写

    const http = require('http');
    const urlLib = require('url');
    
    let server = http.createServer(function (req, res) {
        let obj = urlLib.parse(req.url, true);
        let url = obj.pathname;
        let GET = obj.query;
        console.log(url,GET);
        res.write(GET.user + ": 你好");
        res.end();
    
    }).listen(8080);
    
    

    POST方式:

    const http = require('http');
    const querystring = require('querystring');
    
    let server = http.createServer(function (req, res) {
        //POST
        let str = '';        //接收数据
    
        //data--有一段数据到达(很多次)
        let i = 0;
        req.on('data',function(data) {
            console.log(`第${i++}次收到数据`);
            
            str += data;
        });
        //end--数据全部到达(一次)
        req.on('end',function () {
            let POST = querystring.parse(str);
            console.log(POST);
        });
    
    }).listen(8080);
    
    

    结合以上:

    const http = require('http');
    const fs = require('fs');
    const querystring = require('querystring');
    const urlLib = require('url');
    
    let server = http.createServer(function(req,res) {
        // GET
        let obj = urlLib.parse(req.url,true);
        let url = obj.pathname;
        const GET = obj.query;
    
        //POST
        let str = '';
    
        req.on('data',function(data) {
            str += data;
        })
        req.on('end',function() {
            const POST = querystring.parse(str);
        })
    
        //文件请求
        var file_name = './www' + url;
        fs.readFile(file_name,function(err,data) {
            if(err){
                res.write("404");
            }else{
                res.write(data);
            }
            res.end();
        });
        
    }).listen(8080);
    

    简易httpServer服务搭建:

    后台:

    const http = require('http');
    const fs = require('fs');
    const querystring = require('querystring');
    const urlLib = require('url');
    
    var users = {};      //{"name":"pass","maid":"123123"}
    
    let server = http.createServer(function(req,res) {
        // 解析数据
        var str = '';
        req.on('data',function (data) {
            str += data;
        })
        req.on('end',function () {
            let obj = urlLib.parse(req.url, true);
            
            const url = obj.pathname;
            const GET = obj.query;
            const POST = querystring.parse(str);        
    
            //区分文件和接口
            if(url == '/user'){     //接口
                
                switch (GET.act) 
                {
                        //注册
                    case 'reg':
                        //1.检查用户名是否纯在
                        //2.插入users
                        if(users[GET.user]){
                            //返回错误信息
                            res.write('{"ok":false,"msg":"此用户存在"}');
                        }else{
                            users[GET.user] = GET.pass;
                            //返回成功信息
                            res.write('{"ok":true,"msg":"注册成功"}');
                        }
                        break;
                        //登陆
                    case 'login':
                        //1.检查用户是否纯在
                        //2.检查密码
                        if(users[GET.user]){
                            if(users[GET.user] == GET.pass){
                                res.write('{"ok":true,"msg":"登陆成功"}');
                            }else{
                                res.write('{"ok":false,"msg":"用户名或密码错误"}');
                            }
                        }else{
                            res.write('{"ok":false,"msg":"用户不存在"}');
                        }
    
                        break;
                    default:
                        res.write('{"ok":false,"msg":"未知的act"}');
                        break;
                }
                res.end();
                
            }else{                  //文件     
                //读取文件
                var file_name = './www' + url;
                fs.readFile(file_name,function (err,data){
                    if(err){
                        res.write('404');
                        
                    }else{
                        res.write(data);
                    }
                    res.end();
                });
            }
    
        })
        
    }).listen(8080);
    

    前台

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src="jquery-3.3.1.min.js"></script>
        <script >
            window.onload = function () {
                var oTxtUser = document.getElementById('user');
                var oTxtPass = document.getElementById('pass');
                var oBtnReg = document.getElementById('reg_btn');
                var oBtnLogin = document.getElementById('login_btn');
    
    
                oBtnLogin.onclick = function () {
                    $.ajax({
                        type: "GET",
                        url: "/user",
                        data: { act: 'login', user: oTxtUser.value, pass: oTxtPass.value},
                        success: function (str) {
                            var json = eval('(' + str + ')');
    
                            if(json.ok){
                                alert("登陆成功");
                            }else{
                                alert("登陆失败:" + json.msg);
                            }
                        }
                    });
                  }
                
                //注册按钮
                oBtnReg.onclick = function () {
    
                    $.ajax({
                        url: "/user",
                        data: { act: 'reg', user: oTxtUser.value, pass: oTxtPass.value },
                        type: "GET",
                        success: function (str) {
                            var json = eval('(' + str + ')');
    
                            if(json.ok){
                                alert("注册成功");
                            }else{
                                alert("注册失败" + json.msg);
                            }
                        },
                        error:function(){
                            alert('通信出错');
                        }
                    });
                }
            }
        </script>
    </head>
    <body>
    
            用户:
            <input type="text" name="user" id="user"><br>
            密码:
            <input type="password" name="pass" id="pass"><br>
            <input type="submit" value="注册" id="reg_btn">
            <input type="submit" value="登陆" id="login_btn">
    
    </body>
    </html>
    

    流程:

    前端通过GET/POST的方式将url,data等数据传给后端,后端通过

    let obj = urlLib.parse(req.url, true);
    

    获取Url对象('pathname' 对应前端ajax'url',query对应前端的'data'),在后端处理数据之后,通过:

    res.write('{"ok":false,"msg":"用户名或密码错误"}');
    

    返回错误或者成功信息,然后前端的ajax的成功/失败回调函数执行,参数是后端的返回值

    相关文章

      网友评论

          本文标题:node.js的Http系统模块使用

          本文链接:https://www.haomeiwen.com/subject/cvqcoqtx.html