ExpressJs中何时需要使用路由中间件?
在Express.js中何时使用路由中间件
路由中间件是Express里针对特定路由/路由组复用逻辑的核心工具,以下是最常见的使用场景:
路由级权限校验
当部分接口需要登录、角色权限等校验时,不用在每个路由 handler 里重复写判断逻辑。比如后台接口必须管理员才能访问,写一个中间件统一校验权限,挂载到对应路由前即可。// 管理员权限校验中间件 const checkAdmin = (req, res, next) => { if (!req.session.user || req.session.user.role !== 'admin') { return res.status(403).send('无管理员访问权限'); } next(); }; // 应用到管理员专属路由 app.get('/admin/settings', checkAdmin, (req, res) => { res.send('管理员设置页面'); });路由参数预处理与校验
如果路由包含动态参数(如:postId),可以用中间件提前校验参数合法性,甚至提前查询关联数据挂载到req对象上,避免每个路由重复做相同操作。比如校验文章ID格式并查询文章信息:const loadPost = (req, res, next) => { const postId = req.params.postId; // 校验ID格式 if (!/^\d+$/.test(postId)) { return res.status(400).send('无效的文章ID'); } // 模拟从数据库查询文章 req.post = { id: postId, title: '示例文章', content: '文章内容' }; next(); }; app.get('/posts/:postId', loadPost, (req, res) => { res.send(`文章详情:${JSON.stringify(req.post)}`); });特定路由的日志与统计
若只需给某部分路由做访问日志、请求耗时统计,而非全局所有路由,就用路由中间件。比如给API接口单独记录请求日志:const apiLogger = (req, res, next) => { const startTime = Date.now(); res.on('finish', () => { const duration = Date.now() - startTime; console.log(`API请求:${req.method} ${req.path} | 状态码:${res.statusCode} | 耗时:${duration}ms`); }); next(); }; // 给所有/api前缀的路由挂载日志中间件 app.use('/api', apiLogger); app.get('/api/comments', (req, res) => { res.send('评论列表'); });路由分组的通用逻辑
当一组路由有共同的前置逻辑(比如前缀都是/api/v2),可以创建路由实例并给整个路由组挂载中间件,实现逻辑复用。比如给v2版本的API统一做请求参数格式化:const v2Router = express.Router(); // 统一格式化v2 API的分页参数 v2Router.use((req, res, next) => { req.query.page = parseInt(req.query.page) || 1; req.query.size = parseInt(req.query.size) || 20; next(); }); // v2路由组的接口 v2Router.get('/posts', (req, res) => { res.send(`v2 API - 当前页:${req.query.page},每页条数:${req.query.size}`); }); // 挂载到主应用 app.use('/api/v2', v2Router);路由级别的请求数据处理
某些路由需要单独处理请求体格式、参数转换时,用路由中间件。比如某个表单提交路由需要统一处理字段大小写:const normalizeFormData = (req, res, next) => { if (req.body) { // 把请求体字段转成小写 Object.keys(req.body).forEach(key => { req.body[key.toLowerCase()] = req.body[key]; delete req.body[key]; }); } next(); }; app.post('/submit-form', normalizeFormData, (req, res) => { res.send(`格式化后的表单数据:${JSON.stringify(req.body)}`); });
内容的提问来源于stack exchange,提问作者Farshid Ahsan
相关产品推荐
相关产品推荐

