在上一节,我们讲了当客户端发送的请求方式为post的时候,要如何处理以及获取数据。要先把以流的形式获取数据,再讲数据转为对象,再去获取你想要的东西。当代码量一多起来,多个post请求时,这种写法就显得格外的笨重。所以这一节,我们就讲NodeJS中的中间件。
先给大家解释下什么是中间件?
中间件:用来处理(过滤)请求,最终为路由提供服务
中间件分为四种类型:
:应用级中间件(自定义)
:路由级中间件
:内置中间件
:第三方中间件
我们先来解决post请求,就是引入一个第三方中间件:body-parser
//引入中间件模块
const bodyParser=reuqire('body-parser');
//使用body-parser中间件,将post请求的数据解析为对象
app.use(bodyParser.urlencoded({
//不使用扩展的查询字符串模块qs,而是使用官方提供的querystring模块解析为对象
extend:false
}));
//在路由中获取post请求数据
req.body;
练习:创建服务器,托管静态资源到public目录,创建文件login.html,点击提交,向服务器发送post请求,请求的url:/mylogin,在路由中获取post请求的数据
const express=require('express');
const bodyParser=require('body-parser');
var app=express();
app.listen(8080);
/*这是不使用body-parser中间件来获取数据的方法
const querystring=require('querystring');
app.post('/mylogin',function(req,res){
req.on('data',function(chunk){
var str=chunk.toString();
var obj=querystring.parse(str);
res.send(obj);
});
});*/
//使用body-parser中间件,获取post请求的数据,并解析为对象
app.use(bodyParser.urlencoded({
extended:false
}));
app.post('/mylogin',function(req,res){
console.log(req.body);
res.send(`登录成功,用户名:${req.body.uname} 密码:${req.body.upwd}`);
});
app.use(express.static('./public'));//login.html文件保管到public文件夹中
应用级中间件
app.use(url,function(req,res,next){});
url 表示中间件要给哪一个路由的url使用,对应路由的url
在中间件中可以拦截到请求,也可以做出响应;
next是一个函数,表示要执行下一个中间件或者路由
例子:创建一个路由,方法get url:/shopping; 传递商品的价格price,要求在中间件中将商品的价格加100,最后响应商品价格为:
app.use('/shoping',function(req,res,next){
req.query.price=Number(req.query.price);
req.query.price+=100;
next();
});
app.get('/shopping',function(req,res){
res.send('价格:'+ req.query.price);
});
内置中间件
express当前只有一个内置中间件。
把所有的静态资源托管到指定目录下,如果浏览器请求文件,自动到该目录下查找,不需要创建路由来响应文件。
app.user(express.static('目录'));
路由级中间件
路由器的使用,具体可以参照上一节内容。
好啦,今天中间件就写到这里了,欢迎大家来一起交流,虚心接受你们的建议哦!