node.js的Http系统模块使用

2019-05-05  本文已影响0人  Maiiiiiiiiiiiid

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

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的成功/失败回调函数执行,参数是后端的返回值

上一篇下一篇

猜你喜欢

热点阅读