作用
- 执行任何代码
- 修改请求和响应对象
- 终结请求-响应循环. (让一次请求得到响应)
- 调用堆中的下一个中间件或者路由
分类
/*
1. 应用(全局)级中间件(过滤非法的请求,例如防盗链)
第一种: app.use((request,response,next)=>{}) // 所有请求都需要经过某些处理的时候用此种写法
第二种: 使用函数定义
2. 第三方中间件(例如: body-parser)
app.use(hodyParser.urlencoded({extebded:true}))
3. 内置中间件(express内部封装好的中间件)
app.use(express.urlencoded({extended:true}))
app.use(express.static('public'))
4. 路由器中间件(Router)
备注:
1. 在exoress中, 定义路由和中间件的时候,根据定义的顺序(代码的顺序),将定义的每一个中间件或路由,放在一个类似于数组的容器中,当请求过来的时候,一次从容器中取出中间件和路由,进行匹配,如果匹配成功,交由该路由或中间件处理,如果全局中间件写在了最开始的位置,那么他就是请求的"第一扇门"
2. 对于服务器来说,第一次请求,只有一个请求对象,和一个相应对象,其他任何的request和response都是对二者的引用
*/
中间件实例
使用app.use创建全局中间件
const express = require("express")
const app = express();
// 使用全局中间件----所用请求的第一扇门
app.use((request,response,next)=>{
/**
* 1. 过滤一些不合法的请求,例如防盗链
*/
if(request.get('Referer')){
let miniReferer = request.get("Referer").split("/")[2]
if(miniReferer === "localhost:8081"){
next()
}else{
// 发生了盗链
response.send("请在本站使用资源")
}
}else{
next()
}
})
app.get("/",(request,response)=>{
response.send("success")
})
app.listen(3000,(err)=>{
if(err){
console.log("server error")
}else{
console.log("server success ")
}
})
使用函数方式创建全局中间件
function demo (request,response,next){
if(request.get('Referer')){
let miniReferer = request.get("Referer").split("/")[2]
if(miniReferer === "localhost:8081"){
next()
}else{
// 发生了盗链
response.send("请在本站使用资源")
}
}else{
next()
}
}
// 谁调用,作用在哪个路由下
app.get("/", demo ,(request,response)=>{
response.send("success")
})
使用body-parser中间件
安装
npm i body-parser
示例
const express = require("express")
// 引入body-parser 用于解析post参数
const bodyParser = require("body-parser")
const app = express();
// 使用第三方中间件
app.use(bodyParser.urlencoded({extended:true})) // 解析post请求请求体中所携带的urllencided编码形式的参数为一个对象,挂载到request对象上
app.post("/test",(request,response)=>{
console.log(request.body)
})
使用内置中间件
示例
const express = require("express")
const app = express();
// 使用第三方中间件
app.use(express.urlencoded({extended:true}))
// 使用内置中间件去暴露静态资源(js,css,html,img等文件)
/*
暴露静态资源的弊端: 访问是必须带上文件的扩展名
如 www.xxx.com/index.html 200
www.xxx.com/index 404
*/
app.use(express.static(__dirname+'/public'))
app.post("/test",(request,response)=>{
console.log(request.body)
})