一、中间件是什么?
Express中间件是请求处理流水线 的关键组件,本质就是一个函数,具备以下特征:
• 链式执行 :通过next()
控制流程传递
• 功能模块化 :每个中间件专注单一职责(如日志、验证、压缩)
• 访问完整上下文:可修改请求(req)、响应(res)对象
javascript
// 基础中间件示例
app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next(); // 必须调用next()传递控制权
});
二、中间件的五大类型
-
应用级中间件
javascript// 全局中间件(所有路由生效) app.use(express.json()); // 路径过滤中间件 app.use('/admin', authMiddleware);
-
路由级中间件
javascriptconst router = express.Router(); router.use(logger);
-
错误处理中间件
javascriptapp.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('服务异常!'); });
-
第三方中间件
bash# 常用中间件安装 npm install morgan helmet cors
javascriptapp.use(helmet()); // 安全防护 app.use(morgan('dev')); // 请求日志
-
内置中间件
javascriptapp.use(express.static('public')); // 静态资源 app.use(express.urlencoded({ extended: true })); // 表单解析
三、中间件的执行顺序
Express 中间件按照它们被定义的顺序依次执行。当一个中间件调用 next()
函数时,控制权会传递给下一个中间件或路由处理函数。如果中间件没有调用 next()
函数,请求处理流程将被终止。
javascript
app.use((req, res, next) => {
console.log('第一个中间件');
next();
});
app.use((req, res, next) => {
console.log('第二个中间件');
next();
});
app.get('/', (req, res) => {
res.send('请求处理完成');
});
在上述代码中,当有请求到达时,会依次执行第一个中间件、第二个中间件,最后执行路由处理函数。
四、中间件的实战应用
-
日志记录中间件
记录请求时间、IP、方法等关键信息
javascriptconst fs = require('fs'); app.use((req, res, next) => { const log = `${new Date().toISOString()} - ${req.ip} ${req.method} ${req.url}\n`; fs.appendFile('access.log', log, (err) => { if (err) throw err; }); next(); });
-
身份验证中间件
拦截未授权请求,保护敏感路由
javascriptapp.use('/admin', (req, res, next) => { if (!req.headers.auth) { res.status(401).send('未授权!'); } else { next(); } });
-
路由参数处理
动态捕获URL参数,实现灵活路由
javascriptapp.get('/user/:id', (req, res) => { res.send(`用户ID: ${req.params.id}`); });