1.什么是中间件
所谓的中间件(Middleware
),特指业务流程的中间处理环节
2.express 中间件的调用流程
客户端发送请求到express服务器,连续调用多个中间件进行预处理
3.express中间件的格式
express中间件本质就是一个function处理函数,格式如下:
//形参中必须包括next参数,而路由处理函数只包含req和res
app.get('path',function(req,res,next){
next()
}
4.next函数的作用
next 函数是实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件或路由
5.定义一个简单的中间件
//引入express
const express = require('express');
// 创建web服务器
const app = express();
//定义一个简单的中间件函数
const kw = (req,res,next) =>{
cnsole.log('amazing~~~')
//前一个流程的结果是下一个流程的开始
next()
}
//启动服务器
apps.listen(8080,()=>{
console.log('服务器启动于127.0.0.1:8080')
}
6.全局生效的中间件
全局生效的中间件:客户端发起的任何请求,都会触发的中间件
通过调用app.use(中间件函数) 可以连续设置多个全局中间件,会按照中间件定义的先后顺序依次执行
//引入express
const express = require('express');
//调用express服务器
const app = express();
//定义中间件函数
const mw = (req, res, next) => {
console.log('调用第一个中间件');
//调用中间件函数
next()
}
//设置全局生效的中间件
app.use(mw);
//简化写法
app.use((req, res, next) => {
console.log('调用第二个中间件');
//调用中间件函数
next()
})
app.get('/', (req, res) => {
console.log('调用了/这个路由');
res.send('Home page')
})
app.get('/user', (req, res) => {
console.log('调用了/user这个路由');
res.send('User page')
})
//启动服务器
app.listen(8080, () => {
console.log('running......');
})
7.局部生效的中间件
app.use()用来注册全局中间件,不能使用app.use()注册的中间件都是局部中间件
const express = require('express');
const app = express()
//不适用app.use()的都是局部中间件
const mt = (req, res, next) => {
console.log('调用了局部生效中间件');
next()
}
app.get('/', mt, (req, res) => {
console.log('ok');
res.send('Home Page')
})
app.get('/User', (req, res) => {
console.log('ok');
res.send('User Page')
})
启动服务器
app.listen(8080, () => {
console.log('running...');
})
8.中间件的作用
可以使多个中间件,共享同一份 req
和 res
,
9.中间件的5个注意事项
1. 一定要在路由之前注册中间件
2. 客户端发送过来的请求,可以连续调用多个中间件进行处理
3. 执行完中间件的业务代码之后,不要忘记调用 `next()` 函数
4. 为了防止代码逻辑混乱,调用 `next()` 函数后不要再写额外的代码
5. 连续调用多个中间件时,多个中间件之间,共享 `req` 和 `res` 对象
10.中间件的分类
通过 app.use()
或 app.get()
或 app.post()
,绑定到 app
实例上的中间件,叫做应用级别的中间件
绑定到 express.Router()
实例上的中间件,叫做路由级别的中间件
错误级别中间件的作用: 专门用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问题
格式:错误级别中间件的 function 处理函数中,必须有 4 个形参,形参顺序从前到后,分别是(err, req, res, next)
// 1. 定义路由
app.get('/', (req, res) => {
// 1. 抛出一个自定义的错误
throw new Error('服务器内部发生了错误')
res.send('Home Page.')
})
// 2. 错误级别的中间件
// 注意:错误级别的中间件,必须注册在所有路由之后
app.use((err, req, res, next) => {
// 2.1 在服务器打印错误消息
console.log('发生了错误:' + err.message)
// 2.2 向客户端响应错误相关的内容
res.send(err.message)
})
Express
内置了 3 个常用的中间件:
express.json
(解析 JSON
格式的请求体数据)URL-encoded
格式的请求体数据 )注意:Express
内置的 express.urlencoded
中间件,就是基于 body-parser
这个第三方中间件进一步封装出来的
由第三方开发出来的中间件,可以按需下载并配置第三方中间件
11.自定义中间件
实现步骤:
定义中间件
监听 req
的 data
事件
监听 req
的 end
事件
使用 querystring
模块解析请求体数据
将解析出来的数据对象挂载为 req.body
将自定义中间件封装为模块
// 引入 express
const express = require('express');
// 创建web服务器
const app = express();
// 使用 querystring 模块解析请求体数据
const qs = require('querydtring')
//定义全局生效的中间件
//中间件的作用:共享同一份(req.res)
app.use((req, res, next) => {
let str = '' //存储客户端发送的请求
req.on('data', (chunk) => {
str += chunk;
})
req.on('end', (chunk) => {
str += chunk
req.body = qs.parse(str)
next()
})
})
//创建路由
app.post('/login', (req, res) => {
console.log(req.body);
})
//启动web服务器
app.listen(8080, () => {
console.log('服务器启动http:127.0.0.1');
})