Express 中间件开发完全手册:从基础到高级应用场景

张开发
2026/5/28 3:09:17 15 分钟阅读
Express 中间件开发完全手册:从基础到高级应用场景
Express 中间件开发完全手册从基础到高级应用场景【免费下载链接】express-es6-rest-api:battery: Starter project for an ES6 RESTful Express API.项目地址: https://gitcode.com/gh_mirrors/ex/express-es6-rest-apiExpress 中间件是构建 Node.js 后端服务的核心组件它能够拦截请求、处理业务逻辑并连接不同功能模块。本文将带你从基础概念到实战应用掌握 Express 中间件的开发技巧与最佳实践让你的 API 开发效率提升 300%。一、什么是 Express 中间件中间件本质是一个函数它可以访问请求对象req、响应对象res和应用的请求-响应循环中的下一个中间件函数next。在 Express 应用中中间件就像一条流水线依次处理请求并传递到下一个环节。典型的中间件函数结构如下function middleware(req, res, next) { // 处理逻辑 next(); // 调用下一个中间件 }二、中间件的分类与基础应用2.1 应用级中间件通过app.use()注册的中间件作用于整个应用。在项目的src/index.js中可以看到这类中间件的实际应用// 日志中间件 app.use(morgan(dev)); // 跨域中间件 app.use(cors({ exposedHeaders: config.corsHeaders })); // 请求体解析中间件 app.use(bodyParser.json({ limit : config.bodyLimit }));2.2 路由级中间件绑定到特定路由的中间件在src/api/index.js中通过模块化方式组织export default ({ config, db }) { let api Router(); // 挂载子路由 api.use(/facets, facets({ config, db })); // 根路由 api.get(/, (req, res) { res.json({ version }); }); return api; }2.3 错误处理中间件错误处理中间件需要接收四个参数(err, req, res, next)通常放在所有中间件的最后app.use((err, req, res, next) { res.status(500).json({ error: err.message || Server error }); });三、自定义中间件开发实战3.1 创建日志中间件在src/middleware/index.js中添加自定义日志中间件import { Router } from express; export default ({ config, db }) { let routes Router(); // 自定义请求日志中间件 routes.use((req, res, next) { const start Date.now(); res.on(finish, () { const duration Date.now() - start; console.log(${req.method} ${req.originalUrl} ${res.statusCode} ${duration}ms); }); next(); }); return routes; }3.2 身份验证中间件创建用户认证中间件验证请求头中的 token// src/middleware/auth.js export const authenticate (req, res, next) { const token req.headers.authorization?.split( )[1]; if (!token) { return res.status(401).json({ message: Authentication required }); } try { const decoded jwt.verify(token, config.jwtSecret); req.user decoded; next(); } catch (err) { return res.status(401).json({ message: Invalid token }); } };在路由中使用// src/api/facets.js import { authenticate } from ../middleware/auth; export default ({ config, db }) { let router Router(); // 保护路由 router.get(/, authenticate, (req, res) { res.json(facets); }); return router; }四、中间件高级应用场景4.1 异步中间件处理使用 async/await 处理异步操作需要包装错误处理const asyncMiddleware fn (req, res, next) { Promise.resolve(fn(req, res, next)).catch(next); }; // 使用 router.get(/data, asyncMiddleware(async (req, res) { const data await db.collection(items).find().toArray(); res.json(data); }));4.2 中间件链式调用通过next()实现中间件的顺序执行在src/index.js中可以看到典型的链式调用// 加载自定义中间件 app.use(middleware({ config, db })); // 加载API路由 app.use(/api, api({ config, db })); // 404处理 app.use((req, res) { res.status(404).json({ message: Not found }); });4.3 中间件参数化创建可配置的中间件const rateLimiter (options) { const { windowMs, max } options; const hits new Map(); return (req, res, next) { const now Date.now(); const key req.ip; const requests hits.get(key) || []; // 过滤过期请求 const recentRequests requests.filter(time time now - windowMs); if (recentRequests.length max) { return res.status(429).json({ message: Too many requests }); } recentRequests.push(now); hits.set(key, recentRequests); next(); }; }; // 使用 app.use(rateLimiter({ windowMs: 60000, max: 100 }));五、中间件最佳实践保持单一职责每个中间件只做一件事控制执行顺序按功能逻辑顺序注册中间件错误处理始终处理异步操作中的错误模块化将中间件按功能拆分到不同文件如src/middleware/目录性能考量避免在中间件中执行耗时操作六、常用中间件推荐morganHTTP 请求日志记录cors跨域资源共享helmet安全头设置compression响应压缩express-validator请求数据验证通过合理使用中间件你可以构建出结构清晰、功能强大的 Express 应用。从简单的日志记录到复杂的身份验证中间件系统为 Express 提供了无限的扩展可能。现在就开始在你的项目中实践这些技巧打造专业级的 Node.js API 服务吧【免费下载链接】express-es6-rest-api:battery: Starter project for an ES6 RESTful Express API.项目地址: https://gitcode.com/gh_mirrors/ex/express-es6-rest-api创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

更多文章