• http协议、模块、express框架以及路由器、中间件和mysql模块


    一、http协议

    是浏览器和web服务器之间的通信协议

    1.通用头信息

    request url:请求的url,向服务器请求的数据

    request method:请求的方式   get、post

    status code:响应的状态码

    2.响应头信息

    connection:连接方式,keep-alive持久连接

    Content-Type:响应的文件类型

    Content-Enncoding:压缩类型gzip

    data:响应的时间

    transfer-Ending:响应的传输方式

    location:响应的重定向

    3.请求头信息

    Accept:客户端接受的文件类型有哪些

    Accept-Encoding:客户端接受的压缩类型有哪些

    Accept-Language:客户端接受的语言类型

    Connection:连接方式  keep-alive 持久连接

    4.请求主体

    可有可无,客户端向服务器端请求的数据

    二、http模块

    既可以模拟浏览器向web服务器发请求,也可以创建web服务器

    1.模拟浏览器

    http.get(url,callback);

    get:请求的方法

    url:请求的URL

    callback:回调函数,用于获取服务器端的响应

    res:响应的对象

    res.statsCode:响应的状态码

    res.on(‘data’,function(buf){})

    buf就是响应的数据,格式为buffer

    1.创建web服务器

    var server = http.createServer();//创建web服务器

    server.listen(xxx)//分配端口,监听xxx端口的变化

    server.on(‘request’,function(req,res){})

    //通过事件来接收浏览器的请求,当有请求自动触发该事件

    res  响应对象

    writeHead(状态码,头信息)  设置响应的头信息

    write(文本)  设置响应的文本内容

    end()  结束响应

    req  请求的对象

    url  获取请求的URL

    method  获取请求方法

    headers  获取请求的方法

    headers  获取请求头信息

    const http = require('http');

    //创建web服务器

    var server = http.createServer();

    //监听端口8081

    server.listen(8081);

    //接收浏览器的请求

    server.on('request',function(req,res){

    //根据请求的URL来做出不同响应

    switch(req.url){

    case '/login':

    res.write('this is login page');

    break;

    case '/member':

    res.write('this is member page');

    break;

    case '/':

    res.writeHead(302,{

    location:'/member'

    });

    break;

    default:

    //如果以上所有的url都没有对应的响应

    res.writeHead(404,{});

    res.write('404 not found');

    }

    //结束响应

    res.end();

    });

    三、express框架

    基于nodejs平台的web开发框架

    官网:http://www.expressjs.com.cn

    下载:npm install express

    const express = require(‘express’);  //引入express模块

    var server = express();  //创建web服务器

    server.listen(xxx);  //监听端口xxx

    1.路由

    浏览器向web服务器发请求,web服务器会根据请求的URL和请求的方法做出响应

    路由三要素:请求的URL、请求的方法、回调函数(接收请求、做出响应)

    注意:路由传参不是通过http协议传递的

    响应对象-res

    sendStatus()  设置响应的状态码

    Send() 响应文本,只能使用一次,如果是数字被认为状态码

    sendFile()  响应文件,必须使用绝对路径(_dirname

    redirect()   响应重定向,跳转到另一个URL

    练习:创建多个路由

    请求方法get,请求的URL /login  响应一个html文件

    请求方法get,请求的URL /code  响应一个400状态码

    请求方法get,请求的URL /detail  响应一行文本

    请求对象-req

    method 获取请求方法

    url 获取请求的URL

    headers 获取请求的头信息

    query 获取请求的URL中的查询字符串,并将它解析为对象

    2.路由传参(传数据)

    设置路由中接收的名称

    server.get(‘/product/:lid’,function(req,res){

    req.params  //获取路由传递数据,返回对象

    });

    浏览器中请求并传递

    http://127.0.0.1/xxx/10

    3.post请求

    post请求通过表单提交,服务器端是通过事件来获取post请求的数据

    Req.on(‘data’function(buf){

       Buf:传递的数据,格式是buffer,需要转为普通字符串,转换后是查询字符串,需要借助查询字符串模块解析为对象

    });

    eg:使用postget请求完成注册(用户名,密码,手机,邮箱),服务器端获取注册的数据

     1 <h1>get注册页面</h1>
     2 <form method="get" action="/myreg">
     3     用户:<input type="text" name="uname"><br>
     4     密码:<input type="text" name="upwd"><br>
     5     手机:<input type="text" name="phone"><br>
     6     邮箱:<input type="text" name="email"><br>
     7     <input type="submit">
     8 </form>
     9 <!--
    10 <h1>post注册页面</h1>
    11 <form method="post" action="/myreg">
    12     用户:<input type="text" name="uname"><br>
    13     密码:<input type="text" name="upwd"><br>
    14     手机:<input type="text" name="phone"><br>
    15     邮箱:<input type="text" name="email"><br>
    16     <input type="submit">
    17 </form>
    18 -->
    19 
    20 //引入express第三方框架
    21 const express = require('express');
    22 const querystring = require('querystring');
    23 //创建web服务器
    24 var server = express();
    25 //监听端口
    26 server.listen(8080);
    27 //请求得到一个html文件
    28 //路由:get  /login
    29 
    30 server.get('/login',function(req,res){
    31     res.sendFile(__dirname + '/02_post.html');
    32 });
    33 //获取post请求数据
    34 //通过事件:当浏览器端有请求数据自动触发
    35 server.post('/mylogin',function(req,res){
    36     //获取post请求数据
    37     //通过事件:当浏览器端有请求数据,自动触发
    38     req.on('data',function(buf){
    39         var qs = buf.toString();
    40         //使用查询字符串模块解析为对象
    41         var obj = querystring.parse(qs);
    42         console.log(obj);
    43 
    44     });
    45     res.send('登录成功');
    46 });
    47 
    48 server.get('/reg',function(req,res){
    49     res.sendFile(__dirname + '/reg.html');
    50 });
    51 server.post('/myreg',function(req,res){
    52     req.on('data',function(buf){
    53         //由buffer数据转为查询字符串
    54         var data = buf.toString();
    55         //将查询字符串解析为对象
    56         var obj = querystring.parse(data);
    57 console.log(obj);
    58     });
    59     res.send('注册成功');
    60 });
    61 
    62 //get  /myreg
    63 server.get('/myreg',function(req,res){
    64     res.send('使用get注册成功');
    65     console.log(req.query);
    66 });
    View Code

    4.get请求

    get请求以查询字符串的方式传递数据,在路由中使用req.query属性来获取数据

    get和post请求的区别:

    get请求安全性较低,速度快,地址栏会暴露信息,浏览器会缓存,一般搜索、查询使用get,浏览器地址栏达到一定程度无法使用get请求

    post请求安全性高,速度慢,不会再浏览器地址暴露信息,一般在登录,注册使用postpost请求实际也做了地址的拼接,是在浏览器内部执行的

    四、路由器

    路由在使用过程中,不同的模块可能出现相同的URL,把同一个模块下的所有路由归纳到一个路由器,访问形式需要使用路由器

    注意:使用路由器是为了防止URL冲突

    1.路由器是一个自定义模块

    const express = require(‘express’);

    bar router = express.router();  //创建空的路由器对象

    router.get(‘/list’,function(req,res){});  //往路由器中添加路由

    module.exports = router;  //导出路由器

    2.在web服务器使用

    const userRouter = require(./user.js);  //引入路由器

    server.use(‘/user’,userRouter);  //把用户路由器挂在到/user下,访问形式为/user/list...  

    五、中间件

    中间件为主要的业务逻辑提供服务

    中间件分为:应用级中间件、路由级中间件、内置中间件、第三方中间件、错误处理中间件

    1.应用级中间件

    每个中间件就是在调用一个函数,需要配合其他的中间件或者路由使用

    server.use(回调函数);  拦截所有的路由,所有路由自动调用回调函数

    server.use(‘/url’,回调函数);  拦截特定的路由,只有路由中URL/url才能调用回调函数

    eg:创建路由(get/view)响应当前的浏览次数,每次请求,响应次都会自动加1

     1 const express = require('express');
     2 var server = express();
     3 server.listen(8080);
     4 /*
     5     初始化浏览次数为0
     6     添加中间件拦截/view,让浏览次数加1
     7 */
     8 var count = 0;
     9 server.use('/view',function(req,res,next){
    10     count++;
    11     next();
    12 });
    13 server.get('/view',function(req,res){
    14     //响应浏览次数
    15     res.send('一共浏览了:'+ count.toString() + '次');
    16 });
    View Code

    2.路由级中间件

    用于服务器中将路由器挂在到特定的URL

    server.use(‘/user’,userRouter);

    3.内置中间件

    express中只要一个内置的中间件,叫托管静态资源

    Server.use(express.static(‘要托管的目录’));  

    注意:在托管的时候,如果同时托管多个目录,在执行的时候会按照先后顺序

    托管静态资源到特定目录,如果浏览器请求静态资源,则自动到该目录下寻找

    eg:托管login.html到public目录下,浏览器请求得到该文件,在表单中将用户名和密码使用post请求发给web服务器

     1 <form method = "post" action="/mylogin">
     2     用户:<input type="text" name="uname"><br>
     3     密码:<input type="password" name="upwd"><br>
     4     <input type="submit" value="登录">
     5 </form>
     6 const express = require('express');
     7 const querystring = require('querystring');
     8 //引入第三方中间件
     9 const bodyParser = require('body-parser');
    10 var server = express();
    11 server.listen(8080);
    12 //使用body-parser中间件
    13 //urlencoded:将post请求的数据解析为对象
    14 //extended:是否使用qs模块将查询字符串解析为对象,false表示不适用第三方qs,是使用querystring
    15 server.use(bodyParser.urlencoded({
    16     extended:false
    17 }));
    18 server.use(express.static('public'));
    19 server.post('/mylogin',function(req,res){
    20     /*req.on('data',function(buf){
    21         //由buffer数据转为查询字符串
    22         var data = buf.toString();
    23         //将查询字符串解析为对象
    24         var obj = querystring.parse(data);
    25         console.log(obj);
    26     });*/
    27     //前提:已经配置好body-parser中间件
    28     console.log(req.body);
    29     res.send('登录成功');
    30 });
    View Code

    4.第三方中间件

    就是第三方模块的形式,使用的时候需要先引入body-parser中间件的使用,作用是将post请求数据解析为对象

    可以直接把post请求解析为对象

    Const bodyParser=require(‘body-parser’);//引入模块

    //引入body-parser

    server.use(bodyParser.urlencoded({

    extended:false

    }));

    urlencoded:post请求数据格式为对象

    extended:不适用第三方qs模块,使用核心模块

    querystring:将查询字符串格式化为对象

    注意:在路由中获取post请求数据:req.body返回对象

    六、mysql模块

    连接mysql数据库服务器

    mysql.exe -h127.0.0.1 -p3306 -uroot -p

    进入数据库 use xxx;

    Insert into emp values(...);

    Delete from emp where uid = xxx;

    Update emp set ename = ‘xxx’,sex = xxx where eid = xxx;

    Select eid,ename from emp;

    1.普通连接

     1 //引入mysql模块
     2 const mysql = require('mysql');
     3 //创建连接
     4 var connection = mysql.createConnection({
     5     host:'localhost',
     6     port:'3306',
     7     user:'root',
     8     password:'xxx',
     9     database:'xxx'
    10 });
    11 //执行连接
    12 connection.connect();
    13 var sql = 'select * from emp';
    14 //执行sql语句
    15 connection.query(sql,(err,result)=>{
    16     if(err) throw err;
    17     //打印sql语句的结果
    18     console.log(result);
    19 });
    20 //释放资源
    21 connection.end();
    View Code

    2.使用连接池

    var pool = mysql.createPool({});  创建连接池对象,传递主机名,端口,用户名,密码,

    使用的数据库,连接池大小

    pool.query(sql,callback)

    七、服务器

    1.web服务器(app.js)

    1.1托管静态资源到public

    1.2使用body-parser中间件

    1.3使用路由器挂在到指定的位置

    2.路由器(routes.js)

    2.1引入连接池模块

    2.2创建路由器对象

    2.3往路由器中添加路由

    2.4在路由中使用连接池

    2.5导出路由器

    3.连接池模块(pool.js)

    3.1创建连接池对象

    3.2导出连接池对象

  • 相关阅读:
    POJ 基本算法(3)
    给定范围的素数筛选(POJ 2689)
    无向图、有向图的最小环
    第k短路和A*
    HDU 4302 Holedox Eating (set + iterator)
    笛卡尔树
    HDU 多校联合第一场
    HDU 多校联合第二场
    POJ 图算法(3)
    POJ 1038 Bugs Integrated, Inc. (状态dp)
  • 原文地址:https://www.cnblogs.com/resultset/p/10659406.html
Copyright © 2020-2023  润新知