中间件的分类
① 应用级别的中间件
② 路由级别的中间件
③ 错误级别的中间件
④ Express内置的中间件
⑤ 第三方的中间件
应用级别的中间件
通过 app.use()
或app.get()
或app.post()
,绑定到app实力上的中间件,叫做应用级别的中间件(上篇说的全局和局部)
路由级别的中间件
绑定到express.Router()
实例上的中间件,叫做路由级别的中间件
错误级别的中间件
错误级别的中间件的作用:专门用来捕获项目中发生的异常错误,从而防止项目异常崩溃的问题。
格式:处理函数中必须有四个形参
,分别是(err, req, res, next)
注意:错误级别的中间件必须在所有路由后
实例:
const express = require('express')
const app = express()
app.get('/test', function(req, res) {
throw new Error('服务器内部错误')
res.send('hello word')
})
app.use(function(err, req, res, next) {
console.log(err.message)
res.send('Error' + err.message)
})
// 3、调用app.listen(端口号, 成功的回调)
app.listen(8085, () => {
console.log('服务器运行起来了')
})
Express内置的中间件
① express.static
快速托管静态资源的内置中间件
② express.json
解析JSON格式的请求体数据(仅在4.16.0+的版本中可用)
③ express.urlencoded
解析URL-encoded 格式的请求体数据(仅在4.16.0+的版本中可用)
在服务器中,可以使用req.body
属性,接收客户端发送过来的请求体数据
默认情况下,如果不配置解析表单数据的中间件,则req.body
默认等于undefined
// 配置解析 application/json 格式数据的内置中间件
app.use(express.json())
// 配置解析 application/x-www-form-urlencoded 格式数据的内置中间件
app.use(express.urlencoded({ extended: false }))
第三方的中间件
使用:
const parser = require('body-parser')
app.use(parser.urlencoded({ extended: false })
app.use(parser.json())
自定义中间件
步骤:
① 定义中间件
② 监听req的data事件
③ 监听req的end事件
④ 使用querystring模块解析请求体数据
⑤ 将解析出来的数据对象挂载为req.body
⑥ 将自定义中间件封装为模块
注:querystring已弃用
// 1、导入express
const express = require('express')
const router1 = require('./router/router1')
const qs = require('querystring')
// 2、创建web服务器
const app = express()
app.use(function(req, res, next) {
// 如果数据量比较大,客户端会把数据切割后,分次发送到服务器
// 定义变量,用来存储客户端发来的数据
let str = ''
// 监听req对象的data事件
req.on('data', (chunk) => {
str += chunk
})
// 请求体数据接收完毕,会自动触发req的end事件
req.on('end', () => {
console.log(str);
// 把查询字符串转化为对象
const body = qs.parse(str)
req.body = body
next()
})
})
app.get('/test', function(req, res) {
console.log(req.body);
res.send('hello word')
})
// 3、调用app.listen(端口号, 成功的回调)
app.listen(8085, () => {
console.log('服务器运行起来了')
})