1️⃣ 中间件

2️⃣ 概念

本质上就是一个函数,包含三个参数:request、response、next

2️⃣ 作用

执行任何代码。
修改请求对象、响应对象。
终结请求-响应循环。(让一次请求得到响应)
调用堆栈中的下一个中间件或路由。

2️⃣ 分类

应用(全局)级中间件(过滤非法的请求,例如防盗链)

  1. 1. 第一种写法:app.use((request,response,next)=>{})
  2. 2. 第二种写法:使用函数定义

第三方中间件,即:不是Node内置的,也不是express内置的(通过npm下载的中间件,例如body-parser)

  1. 1. app.use(bodyParser.urlencoded({extended:true}))

内置中间件(express内部封装好的中间件)

  1. 1. app.use(express.urlencoded({extended:true}))
  2. 2. app.use(express.static('public')) //暴露静态资源

路由器中间件 (Router)

2️⃣ 备注

在express中,定义路由和中间件的时候,根据定义的顺序(代码的顺序),将定义的每一个中间件或路由,放在一个类似于数组的容器中,当请求过来的时候,依次从容器中取出中间件和路由,进行匹配,如果匹配成功,交由该路由或中间件处理,如果全局中间件写在了最开始的位置,那么他就是请求的“第一扇门”。
对于服务器来说,一次请求,只有一个请求对象,和一个响应对象,其他任何的request和response都是对二者的引用。

1️⃣ 全局中间件

  1. //【第一种】使用应用级(全局)中间件 - 所有请求的第一扇门 - 所有请求都要经过某些处理的时候用此种写法
  2. app.use((request, response, next) => {
  3. // 全局中间件放在最上部 会获取所有的请求
  4. // 放在这个位置的主要作用是 在路由获取之前进行一次判断
  5. // 如果判断过后需要匹配路由则执行 next()
  6. })
  7. //【第二种】使用全局中间件的方式 - 更加灵活,不是第一扇门,可以在任何需要的地方使用。
  8. function guardPic(request, response, next) {}
  9. app.get('/picture', guardPic, (request, response) => {
  10. // 经过全局中间件的 处理后来判断是否执行回调函数
  11. })

1️⃣ 第三方中间件

  1. //引入body-parser,用于解析post参数
  2. const bodyParser = require('body-parser')
  3. //使用第三方中间件bodyParser
  4. //解析post请求请求体中所携带的urlencoded编码形式的参数为一个对象,随后挂载到request对象上
  5. app.use(bodyParser.urlencoded({
  6. extended: true
  7. }))

1️⃣ 内置中间件

  1. //解析post请求请求体中所携带的urlencoded编码形式的参数为一个对象,随后挂载到request对象上
  2. app.use(express.urlencoded({
  3. extended: true
  4. }))
  5. //使用内置中间件去暴露静态资源 ---- 一次性把你所指定的文件夹内的资源全部交出去。
  6. app.use(express.static(__dirname + '/public'))

1️⃣ 路由器中间件

  1. // 引入 Router 构造函数
  2. const {Router} = require('express')
  3. // 创建一个 Router 实例(路由器就是一个小型的app)
  4. let router = new Router()
  5. // 引入 path 模块 - Node中内置的一个专门用于解决路径问题的库
  6. let {resolve} = require('path')
  7. // 路由
  8. router.get('/login',(req,res)=>{
  9. let url = resolve(__dirname,'../public/login.html')
  10. res.sendFile(url)
  11. })
  12. // 暴露语法
  13. module.exports = function () {
  14. return router
  15. }
  16. // 引入依赖文件
  17. const UIRouter = require('./router/UIRouter')
  18. // 使用UIRouter
  19. app.use(UIRouter())