1️⃣ 中间件
2️⃣ 概念
本质上就是一个函数,包含三个参数:request、response、next
2️⃣ 作用
执行任何代码。
修改请求对象、响应对象。
终结请求-响应循环。(让一次请求得到响应)
调用堆栈中的下一个中间件或路由。
2️⃣ 分类
应用(全局)级中间件(过滤非法的请求,例如防盗链)
1. 第一种写法:app.use((request,response,next)=>{})
2. 第二种写法:使用函数定义
第三方中间件,即:不是Node内置的,也不是express内置的(通过npm下载的中间件,例如body-parser)
1. app.use(bodyParser.urlencoded({extended:true}))
内置中间件(express内部封装好的中间件)
1. app.use(express.urlencoded({extended:true}))
2. app.use(express.static('public')) //暴露静态资源
2️⃣ 备注
在express中,定义路由和中间件的时候,根据定义的顺序(代码的顺序),将定义的每一个中间件或路由,放在一个类似于数组的容器中,当请求过来的时候,依次从容器中取出中间件和路由,进行匹配,如果匹配成功,交由该路由或中间件处理,如果全局中间件写在了最开始的位置,那么他就是请求的“第一扇门”。
对于服务器来说,一次请求,只有一个请求对象,和一个响应对象,其他任何的request和response都是对二者的引用。
1️⃣ 全局中间件
//【第一种】使用应用级(全局)中间件 - 所有请求的第一扇门 - 所有请求都要经过某些处理的时候用此种写法
app.use((request, response, next) => {
// 全局中间件放在最上部 会获取所有的请求
// 放在这个位置的主要作用是 在路由获取之前进行一次判断
// 如果判断过后需要匹配路由则执行 next()
})
//【第二种】使用全局中间件的方式 - 更加灵活,不是第一扇门,可以在任何需要的地方使用。
function guardPic(request, response, next) {}
app.get('/picture', guardPic, (request, response) => {
// 经过全局中间件的 处理后来判断是否执行回调函数
})
1️⃣ 第三方中间件
//引入body-parser,用于解析post参数
const bodyParser = require('body-parser')
//使用第三方中间件bodyParser
//解析post请求请求体中所携带的urlencoded编码形式的参数为一个对象,随后挂载到request对象上
app.use(bodyParser.urlencoded({
extended: true
}))
1️⃣ 内置中间件
//解析post请求请求体中所携带的urlencoded编码形式的参数为一个对象,随后挂载到request对象上
app.use(express.urlencoded({
extended: true
}))
//使用内置中间件去暴露静态资源 ---- 一次性把你所指定的文件夹内的资源全部交出去。
app.use(express.static(__dirname + '/public'))
1️⃣ 路由器中间件
// 引入 Router 构造函数
const {Router} = require('express')
// 创建一个 Router 实例(路由器就是一个小型的app)
let router = new Router()
// 引入 path 模块 - Node中内置的一个专门用于解决路径问题的库
let {resolve} = require('path')
// 路由
router.get('/login',(req,res)=>{
let url = resolve(__dirname,'../public/login.html')
res.sendFile(url)
})
// 暴露语法
module.exports = function () {
return router
}
// 引入依赖文件
const UIRouter = require('./router/UIRouter')
// 使用UIRouter
app.use(UIRouter())