Express中间件简介
Express是一个路由和中间件Web框架,其自身的功能很少:Express应用程序本质上是一系列中间件函数调用。
中间件功能是可以访问请求对象 (req)
,响应对象(res)
和应用程序
的请求、响应周期中的下一个中间件功能的功能。
下一个中间件功能通常由名为的变量表示next。
中间件功能可以执行以下任务:
- 执行任何代码。
- 更改请求和响应对象。
- 结束请求-响应周期。
- 调用堆栈中的下一个中间件函数。
通俗来讲,中间件就是处理过程中的一个环节
如果当前的中间件功能没有结束请求、响应周期,则必须调用next()
将控制权传递给下一个中间件功能。否则,该请求将被挂起。
Express应用程序可以使用以下类型的中间件:
- 应用层中间件
- 路由器级中间件
- 错误处理中间件
- 内置中间件
- 第三方中间件
不管是使用哪一种中间件,都要先引入express模块
应用层中间件
使用函数将应用程序级中间件绑定到应用程序对象的实例,其中,中间件函数处理的请求的HTTP方法是app.use()
方法:
- 没有安装路径的中间件,每次服务器收到请求时,都会执行改功能
var app = express()
app.use((req, res, next)=>{
//获取访问的时间
console.log(Date.now())
next()
})
- 有安装路径的中间件功能,该函数针对
/user
路径上的任何类型的HTTP请求执行。
app.use('/user',(req,res,next)=>{
//记录访问的日志
console.log('访问了/user');
next();
})
- middleware sub-stack(中间件子堆栈),该子栈将任何类型的HTTP请求的请求信息打印到/user/路径。
app.get('/abc',(req,res,next)=>{
console.log(1);
next();
},(req,res)=>{
console.log(2);
// res.send('okk')
})
app.get('/abc',(req,res,next)=>{
console.log(3);
res.send('okkkk')
})
app.listen(3000,()=>{
console.log('running...');
})
此时输出的结果是:
不会输出3的原因是:get请求定义了两条路由,1和2是同一个路由,3是另外一个路由,第二条路由不会引起任何问题,但是由于第一条路由将结束请求、响应周期,因此它将永远不会被调用,所以不会输出3
解决办法:调用next('route')
方法,它的功能是从路由器中间件堆栈中跳过其余中间件功能,及跳转到下一个路由。
app.get('/abc',(req,res,next)=>{
console.log(1);
next('route');
},(req,res)=>{
console.log(2);
// res.send('okk')
})
app.get('/abc',(req,res,next)=>{
console.log(3);
res.send('okkkk')
})
app.listen(3000,()=>{
console.log('running...');
})
这样就可以输出3了
- 中间件也可以在数组中声明之后调用
const express = require('express');
const app = express();
var cb0 = function(req,res,next){
console.log('cb0');
next();
}
var cb1 = function(req,res,next){
console.log('cb1');
next();
}
var cb2 = function(req,res){
res.send('pilapalala');
}
app.get('/okk',[cb0,cb1,cb2]);
app.listen(3000,()=>{
console.log('running...')
})
第三方中间件
使用第三方中间件向Express应用程序添加功能。安装Node.js模块以获得所需的功能,然后在应用程序级别或路由器级别将其加载到应用程序中。
$ npm install body-parser
var bodyParser = require('body-parser')
body-parser
是一个HTTP请求体解析的中间件,使用这个模块可以解析JSON、Raw、文本、URL-encoded格式的请求体
body-parser模块的API
当请求体解析之后,解析值会被放到req.body属性中,当内容为空时候,为一个空对象{}
- bodyParser.json()–解析JSON格式
- bodyParser.raw()–解析二进制格式
- bodyParser.text()–解析文本格式
- bodyParser.urlencoded()–解析文本格式
利用第三方中间实现登录验证的功能
第一步:安装body-parser 第三方中间件,并引入js文件中
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
//挂载 参数处理的中间件---post请求
app.use(bodyParser.urlencoded({extended:false}));
app.post('/ok',(req,res)=>{
//获取请求的参数
let data = req.body;
console.log(data);
})
app.listen(3000,()=>{
console.log('running...');
})
第二步:创建public文件夹===>创建ok.html页面 页面内容如下:
<form action="http://localhost:3000/ok" method="POST">
用户名:
<input type="text" name="username" id="name"><br>
密码:
<input type="password" name="password" id="pwd"><br>
<input type="submit" value="提交" id="btn">
</form>
第三步:设置根目录
//挂载内置的中间件 处理静态资源文件托管
app.use(express.static('public'));
第四步:测试结果,查看后台打印的结果
第五步:添加判断用户名和密码是否正确条件
app.post('/ok',(req,res)=>{
//动态路由获取参数--req.params
//获取请求的参数
let data = req.body;
console.log(data);
//data是对象类型
if (data.username=='admin'&&data.password=='222') {
res.send('success')
}else{
res.send('failure')
}
res.send('ok')
})
第六步:处理get参数代码
app.get('/ok',(req,res)=>{
//获取请求的参数
let data = req.query;
console.log(data);
//data是对象类型
if (data.username=='admin'&&data.password=='222') {
res.send('get success')
}else{
res.send('get failure')
}
res.send('ok')
})
测试之前修改页面数据提交方式–>get