面向切面编程 AOP

  1. 将日志记录、性能统计、安全控制、事务处理、异常处理等代码从业务逻辑中划分出来,通过对这些行为的分离,希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑代码;
  2. 利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率和可维护性;
  3. 在现有代码中,在程序的生命周期或者横向流程中 加上/减去 一个或多个功能,不影响原有功能;

中间件函数

  1. 参数说明: 中间件函数中有三个基本参数 reqresnext

    • req:请求相关的对象,和下一个中间件函数中的 req 对象是一个对象;
    • res:响应相关的对象,和下一个中间件函数中的 res 对象是一个对象;
    • next:是一个函数,调用它将会跳出当前的中间件函数,执行后续中间件;如果不调用 next 也不执行 res.end ,则整个请求都会在当前中间件卡住;
  2. 中间件的工作流程:

  3. 在中间件函数中可以执行以下任务:

    • 执行任何代码;
    • 修改 request 或者 response 响应对象;
    • 结束请求响应周期;
    • 调用下一个中间件;
  4. 注意:如果当前中间件功能没有结束请求-响应周期,则必须调用 next() 将控制权传递给下一个中间件功能,否则请求将被挂起;

基础中间件源码图解

app.use(中间件) <= 等价 => app.use('/',中间件)

错误处理中间件

  • 与其他中间件函数定义方式相同的错误处理中间件,使用四个参数 errreqresnext 缺一不可;

  • 在所有的中间件之后挂载错误处理中间件

app.use((err, req, res, next) => {
  console.log('错误', err)
  res.status(500).json({ error: err.message })
})

内置中间件

中间件 描述
express.json() 解析 Content-Typeapplication/json 格式的请求体
express.urlencoded() 解析 Content-Typeapplication/x-www-form-urlencoded 格式的请求体
express.raw() 解析 Content-Typeapplication/octet-stream 格式的请求体
express.text() 解析 Content-Typetext/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 属性
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 面向切面编程 AOP
  2. 2. 中间件函数
  3. 3. 基础中间件源码图解
  4. 4. 错误处理中间件
  5. 5. 内置中间件
  6. 6. 常用三方中间件