面向切面编程 AOP
- 将日志记录、性能统计、安全控制、事务处理、异常处理等代码从业务逻辑中划分出来,通过对这些行为的分离,希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑代码;
- 利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率和可维护性;
- 在现有代码中,在程序的生命周期或者横向流程中 加上/减去 一个或多个功能,不影响原有功能;
中间件函数
-
参数说明: 中间件函数中有三个基本参数 req、res、next;
- req:请求相关的对象,和下一个中间件函数中的 req 对象是一个对象;
- res:响应相关的对象,和下一个中间件函数中的 res 对象是一个对象;
- next:是一个函数,调用它将会跳出当前的中间件函数,执行后续中间件;如果不调用 next 也不执行 res.end ,则整个请求都会在当前中间件卡住;
-
中间件的工作流程:
-
在中间件函数中可以执行以下任务:
- 执行任何代码;
- 修改 request 或者 response 响应对象;
- 结束请求响应周期;
- 调用下一个中间件;
-
注意
:如果当前中间件功能没有结束请求-响应周期,则必须调用 next() 将控制权传递给下一个中间件功能,否则请求将被挂起;
基础中间件源码图解
app.use(中间件)
<= 等价 =>app.use('/',中间件)
错误处理中间件
与其他中间件函数定义方式相同的错误处理中间件,使用四个参数 err、req、res、next 缺一不可;
在所有的中间件之后挂载错误处理中间件
app.use((err, req, res, next) => {
console.log('错误', err)
res.status(500).json({ error: err.message })
})
内置中间件
中间件 | 描述 |
---|---|
express.json() | 解析 Content-Type 为 application/json 格式的请求体 |
express.urlencoded() | 解析 Content-Type 为 application/x-www-form-urlencoded 格式的请求体 |
express.raw() | 解析 Content-Type 为 application/octet-stream 格式的请求体 |
express.text() | 解析 Content-Type 为 text/plain 格式的请求体 |
express.static() | 托管静态资源文件 |
const express = require("express");
const app = express(); // 创建一个 express 应用
const path = require("path");
const staticRoot = path.resolve(__dirname, "../public");
/**
* 当请求时,会根据请求路径(req.path),从指定的目录中寻找是否存在该文件,如果存在,直接响应文件内容,而不再移交给后续的中间件
* 如果不存在文件,则直接移交给后续的中间件处理
* 默认情况下,如果映射的结果是一个目录,则会自动使用 index.html 文件
*/
app.use(express.static(staticRoot));
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.post("/api/student", (req, res) => {
console.log(req.body);
});
app.use(require("./errorMiddleware")); // 错误中间件
const port = 5008;
app.listen(port, () => {
console.log(`server listen on ${port}`);
});
常用三方中间件
中间件 | 描述 |
---|---|
body-parser | 解析 body 中的数据,并将其保存为 Request.body 属性 |
cookie-parser | 解析客户端 cookie 中的数据,并将其保存为 Request.cookie 属性 |
express-session | 解析服务端生成的 sessionid 对应的 session 数据,并将其保存为 Request.session 属性 |
cors | 解析消息头部的访问来源 |
query | 这个中间件将一个查询字符串从 URL 转换为 JS 对象,并将其保存为 Request.query 属性 |
Express👉 请求和响应
上一篇