当前位置: 首页 > news >正文

Express 中间件分类

一、 按功能用途分类

1. 应用级中间件

这类中间件应用于整个 Express 应用程序,会对每个进入应用的请求进行处理。通过 `app.use()` 方法挂载,可用于执行一些全局性的任务,像日志记录、请求预处理、设置响应头这类操作。

const express = require("express");

const app = express();

// 记录请求日志的应用级中间件

app.use((req, res, next) => {

  console.log(`Received ${req.method} request for ${req.url}`);

  next();

});

app.get("/", (req, res) => {

  res.send("Hello, World!");

});

app.listen(3000, () => {

  console.log("Server running on port 3000");

});

2. 路由级中间件

它与特定的路由相关联,只会处理匹配该路由的请求。可以使用 `express.Router()` 创建路由实例,再在上面挂载中间件。

const express = require("express");

const app = express();

const router = express.Router();

// 路由级中间件

router.use((req, res, next) => {

  console.log("This is a router-level middleware");

  next();

});

router.get("/", (req, res) => {

  res.send("Hello from the router!");

});

app.use("/router", router);

app.listen(3000, () => {

  console.log("Server running on port 3000");

});

3. 错误处理中间件

专门用来捕获和处理应用程序里的错误。错误处理中间件有四个参数 `(err, req, res, next)`,在调用 `next(err)` 传递错误时会被触发。

const express = require("express");

const app = express();

app.get("/", (req, res, next) => {

  const err = new Error("Something went wrong");

  next(err);

});

// 错误处理中间件

app.use((err, req, res, next) => {

  console.error(err);

  res.status(500).send("Internal Server Error");

});

app.listen(3000, () => {

  console.log("Server running on port 3000");

});

4. 内置中间件

Express 自身提供了一些内置中间件,能够实现常见的功能。例如 `express.static()` 可用于提供静态文件服务,`express.json()` 用于解析 JSON 格式的请求体,`express.urlencoded()` 用于解析 `x-www-form-urlencoded` 格式的请求体。

const express = require("express");

const app = express();

// 使用 express.static 提供静态文件服务

app.use(express.static("public"));

// 使用 express.json 解析 JSON 请求体

app.use(express.json());

app.post("/data", (req, res) => {

  console.log(req.body);

  res.send("Data received");

});

app.listen(3000, () => {

  console.log("Server running on port 3000");

});

5. 第三方中间件

由社区开发和维护,能为 Express 应用增添额外的功能。比如 `body-parser` 用于解析请求体,`morgan` 用于记录请求日志,`cookie-parser` 用于解析 Cookie。

const express = require("express");

const app = express();

const morgan = require("morgan");

const bodyParser = require("body-parser");

// 使用 morgan 记录请求日志

app.use(morgan("dev"));

// 使用 body-parser 解析请求体

app.use(bodyParser.json());

app.post("/submit", (req, res) => {

  console.log(req.body);

  res.send("Form submitted successfully");

});

app.listen(3000, () => {

  console.log("Server running on port 3000");

});

二、按执行顺序分类

1. 前置中间件

在路由处理函数之前执行,主要用于对请求进行预处理,像验证请求参数、解析请求体、进行身份验证这类操作。

2. 后置中间件

在路由处理函数之后执行,一般用于对响应进行处理,比如设置响应头、格式化响应数据等。

三、按是否异步分类

1. 同步中间件

同步执行代码,不会使用异步操作(如 `Promise`、`async/await`)。当中间件执行完其逻辑后,会立即调用 `next()` 函数将控制权传递给下一个中间件或路由处理函数。

2. 异步中间件

包含异步操作,例如数据库查询、文件读取、网络请求等。在异步中间件里,需要使用 `async/await` 或者回调函数来处理异步操作,确保在异步操作完成后再调用 `next()` 函数。

const express = require("express");

const app = express();

// 异步中间件示例

app.use(async (req, res, next) => {

  try {

    // 模拟异步操作

    await new Promise((resolve) => setTimeout(resolve, 1000));

    console.log("Async middleware executed");

    next();

  } catch (err) {

    next(err);

  }

});

app.get("/", (req, res) => {

  res.send("Hello, World!");

});

app.listen(3000, () => {

  console.log("Server running on port 3000");

});

相关文章:

  • Vue和React的区别
  • C# 特性 学习记录
  • springboot023学生宿舍管理系统
  • 《LSTM与HMM:序列建模领域的双雄对决》
  • GPU的核心的时钟频率,使用什么命令查看和计算
  • 蓝桥杯 Java B 组之简单数学问题(素数判断、最大公约数)
  • 在anaconda环境中构建flask项目的exe文件
  • DrissionPage(实战)
  • GitHub 使用教程:从入门到进阶
  • 异构计算架构助力智能座舱实现高效低耗体验
  • PMTUD By UDP
  • RK3588开发板部署DeepSeek-R1-Distill-Qwen-1.5B的步骤及问题
  • OSI 参考模型和 TCP/IP 参考模型
  • AI技术+Xsens惯性捕捉技术:科技碰撞下的无限可能
  • 【网络测试】tmux工具常用指令
  • 单片机上SPI和IIC的区别
  • 动态建表并插入数据
  • 【uniapp-小程序】实现方法调用的全局tips弹窗
  • Centos搭建python环境
  • Python创建Excel的方式——提供4中方式可供参考
  • 新城市志|上海再攻坚,营商环境没有最好只有更好
  • 澎湃研究所“营商环境研究伙伴计划”启动
  • 成都公积金新政征求意见:购买保障性住房最高贷款额度上浮50%
  • 高进华“控股”后首份年报出炉,史丹利账上可动资金大幅缩水
  • 外交部:解放军参加红场阅兵体现了中方对历史的尊重和铭记
  • 马上评|颜宁“简历打假”的启示