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)错误级中间件

 略

原文地址:https://www.cnblogs.com/hd-test/p/11865170.html