中间件
约 582 字大约 2 分钟
2025-07-25
中间件函数是可以访问请求对象 (req)、响应对象 (res) 以及应用程序请求-响应生命周期中下一个中间件函数的函数。
中间件是 Express 最重要的设计。可以说,一个 Express 应用程序就是由很多中间件函数组成的。
中间件的位置很重要:程序会从上到下的顺序执行中间件函数,只用当中间件挂载之后与之匹配的请求才会执行中间件函数。
路由级中间件
路由可以看作一种特殊的中间件,只不过它是绑定到 express.Router()
的实例,使用 router.use()
和 router.METHOD()
函数加载,称为 路由级中间件。
const express = require("express");
const app = express();
const router = express.Router();
router.use((req, res, next) => {
console.log("Time:", Date.now());
next(); // 调用下一个匹配的中间件函数
});
router.get("/user/:id", (req, res, next) => {
console.log(req.params.id);
res.render("special");
});
应用程序级中间件
通过使用 app.use()
和 app.METHOD()
函数,将应用程序级中间件绑定到 app 对象的实例。
// 一个没有挂载路径的中间件函数,每当应用程序收到请求时,该函数都会执行。
app.use((req, res, next) => {
req.name = "Tom"; // 后续所以中间件都可以访问 req.name
console.log("Time:", Date.now());
next();
});
//此示例显示了一个挂载在 /user/:id 路径上的中间件函数。该函数将针对 /user/:id 路径上的任何类型的 HTTP 请求执行。
app.use("/user/:id", (req, res, next) => {
console.log("Request Type:", req.method);
console.log("name:" + req.name);
next();
});
区别
中间件(Middleware)是处理 HTTP 请求的核心机制,分为应用程序级中间件和路由级中间件两种类型。它们的核心区别在于作用范围和绑定对象。
特性 | 应用程序级中间件 | 路由级中间件 |
---|---|---|
绑定对象 | app 实例 (app.use() ) | Router 实例 (router.use() ) |
作用范围 | 全局或指定路径(影响所有匹配请求) | 仅限绑定到该路由实例的路径 |
代码组织 | 适用于全局逻辑 | 模块化路由组,避免全局污染 |
复用性 | 直接作用于整个应用 | 可独立创建多个路由实例,灵活组合 |
典型使用场景 | 日志、跨域、全局错误处理 | 分组路由的身份验证、权限控制 |