中间件是什么
中间件是一堆方法,可以接收客户端发来的请求、可以对请求作出响应,也可以将请求继续交给下一个中间件继续处理
中间件由2部分组成:中间件方法,请求处理函数
中间件方法由Express提供,负责拦截请求,请求处理函数由开发人员提供,负责处理请求
路由也是中间件
app.get('请求路径','处理函数') // 接收并处理get请求
app.post('请求路径','处理函数') // 接收并处理post请求
路由中间件
可以针对同一个请求设置多个中间件,对同一个请求进行多次处理 (路由中间件)
默认情况下,请求从上到下依次匹配中间件,一旦匹配成功,终止匹配(就不会往下执行了 不会调用后面的路由处理 调用next() 就会继续往下执行)
const app = require('express')()
// 中间件一
app.get('/add',(req, res, next)=>{
req.name = "/add 路由中间件"
next() // 调用下一个中间件
})
// 中间件二
app.get('/add',(req, res, next)=>{
req.age = 19
next()
})
app.get('/add', (req, res)=>{
let {name, age} = req
res.send({name, age})
})
// localhost:3000/add
app.listen(3000,()=>console.log("服务器启动成功"))
全局/应用程序级别中间件 app.use
app.use 匹配所有的请求方式,可以直接传入处理函数 代表接收所有请求
app.use((req, res, next)=>{
next()
})
关心路径的中间件
匹配 路径以 /admin 开头的 /admin /admin/a /admin/a/b …
app.use('/admin',(req, res, next)=>{
next()
})
示例
const app = require('express')()
// 所要请求都会触发
app.use((req, res, next)=>{
req.name = "应用程序级别中间件"
next()
})
// /admin
app.use('/admin',(req, res, next)=>{
req.name1 = "/admin 路径的请求"
next()
})
app.get('/admin/add', (req, res)=>{
let {name, name1} = req
res.send({name, name1})
})
// localhost:3000/admin/add
app.listen(3000,()=>console.log("服务器启动成功"))
错误处理中间件
在程序执行的过程中,不可避免的会出现一些错误,比如文件读取失败,数据库连接失败
默认只能捕获同步的错误
异步错误处理
const app = require('express')()
// 所要请求都会触发
app.use((req, res, next)=>{
req.name = "应用程序级别中间件"
next({err:'ffff'}) // 传入错误参数 异步错误处理
// 或者 抛出错误 默认只能捕获同步的错误
// thorw new Error("程序执行错误")
// thorw "程序执行错误"
// 或者 代码报错
})
app.get('/admin/add', (req, res)=>{
let {name, name1} = req
res.send({name, name1})
})
// 错误处理
app.use((err,req, res, next)=>{
console.error(err) // next() 传入的内容
res.status(500).send("错误处理")
})
app.listen(3000,()=>console.log("服务器启动成功"))
内置中间件
// express.static
// express.json
// express.urlencoded
// ....
// 开放静态资源 path.join(__dirname,"./public/") 会改造成绝对路径
app.use("/public/",express.static(path.join(__dirname,"./public/")))
app.use("/node_modules/",express.static(path.join(__dirname,"./node_modules/")))
第三方中间件
// border-parser
// compression
// ....
let bodyParser = require("body-parser")
// post参数处理
app.use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())
中间件应用
- 路由保护,客户端在访问需要登录的页面时,可以先使用中间件判断用户登录状态,用户如果没有登录则拦截请求,直接响应,禁止用户进入需要登录的页面。
- 网站维护公告,在所要路由的最上面定义接收所有请求的中间件,直接为客户端作出响应,网站正在维护中。(在最上面定义一个app.use直接响应内容)
- 自定义404页面(在最后定义一个app.use响应404内容) 404示例