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