zoukankan      html  css  js  c++  java
  • node.js(4)——中间件

    中间件

    作用:为主要的业务逻辑服务

    分为5个:

      应用级中间件、路由级中间件、内置中间件、第三方中间件、错误级中间件

    1)应用级中间件

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

       server.use(回调函数)      拦截所有的路由

       server.use('/detail',回调函数)     拦截特定的路由

    例1:拦截所有路由

    // 验空--->注册--->存数据库
    // 中间件是express下的一个功能
    const express=require('express');
    var server=express();
    server.listen(3000);
    // 创建中间件
    // ---拦截浏览器的请求,也可以做出响应
    // 拦截所有的路由中的请求
    server.use((req,res,next)=>{
        console.log('验证了是否为空');
        //res.send('验证失败');
        // 如果通过,执行下一个中间件
        next();
    });
    
    // 创建注册路由
    server.get('/reg',(req,res,next)=>{
        res.send('注册成功');
        next();
    });
    // 创建登录路由
    server.get('/login',(req,res)=>{
        res.send('登录成功');
    });
    // 创建一个中间件
    server.use((req,res,next)=>{
        console.log('将数据存储到了数据库中');
    });

    例2:拦截特定的路由

    /* 创建web服务器 */
    const express=require('express');
    var server=express();
    server.listen(3000);
    /* 在路由前,添加中间件,打印"查询了是否存在"
    拦截特定的路由,拦截请求的url为/detail的路由 */
    server.use('/detail',(req,res,next)=>{
        console.log('查询了是否存在');
        next();
    });
    
    /* 创建web服务器,新建路由,请求的方法:get   请求的url:/detail */
    server.get('/detail',(req,res)=>{
        res.send('this is product detail');
    });

    例3:

    /* 创建路由(get,/view) 响应当前的浏览次数,每次请求,响应的次数加1,
    在函数外初始化一个全局变量,设置值为0,在中间件中实现变量加1,在路由中响应变量 */
    
    /* 创建web服务器 */
    const express=require('express');
    var server=express();
    server.listen(3000);
    /*中间件*/
    var num=0;
    server.use('/view',(req,res,next)=>{
        num++;
        next();
    });
    
    /*路由*/
    server.get('/view',(req,res)=>{
        res.send(num.toString());
    });

     

    2)路由级中间件

       用于将一个路由器挂载到特定的url

       server.use('/user',userRouter);

    3)内置中间件(托管静态资源到某一个目录,若浏览器端要请求静态资源,则自动到这个目录下查找)

       在express中只有一个内置的中间件

       静态资源:html   css   客户端js    图像......

       server.use(express.static('要托管的目录'));

        例1:

    /* 创建web服务器 */
    const express=require('express');
    var server=express();
    server.listen(3000);
    
    // 使用内置中间件
    // 托管静态资源(html,css,js,图像...)到public目录下
    // 如果浏览器请求这些文件,自动会到public下寻找
    server.use(express.static('public'));

     例2:

    /* 将静态资源托管到files目录下,查看如果两个静态目录
    下有相同名称的文件,显示哪一个 */
    
    const express=require('express');
    var server=express();
    server.listen(3000);
    // 查找规则是按照顺序来的
    server.use(express.static('public'));
    server.use(express.static('files'));

    例3:

    /*创建web服务器,托管静态文件,输入身份证号,点击提交,
    服务器端获取输入的身份证号(在中间件中获取),
    截取出生的年月日和性别,在路由中响应给浏览器 */
    const express=require('express');
    const querystring=require('querystring');
    var server=express();
    server.listen(3000);
    
    // 使用内置中间件来托管静态资源
    server.use(express.static('public'));
    var year,month,day,sex;
    // 使用中间件来拦截mycheck请求
    server.use('/mycheck',(req,res)=>{
        // 获取身份证中的出生年月日
        req.on('data',(buf)=>{
            var str=buf.toString();
            console.log(str);
            // 将查询字符串解析为对象
            var obj=querystring.parse(sre);
            // 获取年月日和性别
            var id=obj.sid;
            year=id.substr(6,4);
            month=id.substr(10,2);
            data=id.substr(12,2);
            sex=id.substr(-2,1);
    
        });
    
    });
    
    // 路由
    server.post('/mycheck',(req,res)=>{
     res.send('${year}年${month}月{data}日 性别${sex%2==1?'男':'女'}');
    });

    4)第三方中间件

      1> body-parser

      将post请求的数据解析为对象

      步骤:

    • 使用中间件
    • 在路由中获取数据
      •   req.body    返回一个数据的对象格式 

    例1:

    const express=require('express');
    const bodyParser=require('body-parser');
    var server=express();
    server.listen(3000);
    // 使用内置中间件来托管静态资源
    server.use(express.static('public'));
    // 使用第三方的中间件body-parser,将post请求的数据解析为对象
    // urlencoded将post请求数据解析为对象,默认使用qs
    // extended是否使用扩展的qs模块将查询字符串解析为对象,false 不使用 
    server.user(bodyParser.urlencoded({
        extended:false
    
    }));
    // 路由
    server.post('/mylogin',(req,res)=>{
        // 获取post请求的数据
        console.log(req.body);
    });

    【login.html文件】存在于public目录下

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
    </head>
    <body>
        <form action="/mylogin" method="post">
            用户<input type="text" name="uname"><br>
            密码<input type="text" name="upwd"><br>
            <input type="submit">
            
        </form>
    
    </body>
    </html>

    【复习】

    浏览器向服务器端传递数据的方式:

    get       req.query

    post      req.body  

    路由      req.params

    5)错误级中间件

     略

  • 相关阅读:
    Js原型对象理解
    Garbage In Garbage Out
    JournalNode的作用
    SecondaryNameNode 的作用
    Hive Map数据长尾问题
    Hive基本操作
    Hadoop中NameNode的工作机制
    技术架构分析与架构分析
    Sqoop报错Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
    项目管理PMP相关
  • 原文地址:https://www.cnblogs.com/hd-test/p/11865170.html
Copyright © 2011-2022 走看看