如何在Node.js Express中全局调用请求前后的指定函数?
如何在Express中全局执行请求处理函数
嘿,这个需求太常见了!完全不用在每个接口里重复写函数调用——Express的中间件机制就是为这种全局场景设计的,能让你指定的函数自动在所有(或特定范围)请求的处理流程中执行,省心又高效。
核心方案:全局中间件
Express的app.use()方法可以注册全局中间件,所有进入服务器的请求都会先经过这个中间件函数,再到达对应的路由处理逻辑。
代码示例
const express = require('express'); const app = express(); // 定义你要全局执行的函数 const globalHandler = (req, res, next) => { // 这里写你需要的逻辑,比如记录请求日志、验证通用权限等 console.log(`[${new Date().toISOString()}] 收到请求:${req.method} ${req.url}`); // 务必调用next(),让请求继续流向后续的路由处理 next(); }; // 注册全局中间件——要放在所有路由定义之前! app.use(globalHandler); // 你的现有路由,无需修改任何代码 app.get('/admin/logs', (req, res) => { res.status(200).json({ logs: ['log1', 'log2'] }); }); // 其他接口也会自动触发globalHandler app.post('/api/users', (req, res) => { res.status(201).json({ message: '用户创建成功' }); }); app.listen(3000, () => { console.log('服务器运行在 http://localhost:3000'); });
进阶:针对特定路由前缀生效
如果不需要对所有接口生效,只想让/admin开头的接口触发这个函数,可以给app.use()指定路径前缀:
// 只有/admin开头的请求会经过这个中间件 app.use('/admin', globalHandler);
响应发送后执行逻辑
如果你的函数需要在响应发送给客户端之后执行(比如统计请求耗时),可以监听res对象的finish事件:
const globalHandler = (req, res, next) => { const startTime = Date.now(); next(); // 先让请求处理完成 // 响应发送后执行的逻辑 res.on('finish', () => { const elapsedTime = Date.now() - startTime; console.log(`请求${req.url}耗时:${elapsedTime}ms`); }); };
注意事项
- 中间件顺序很关键:一定要把全局中间件注册在所有路由定义之前,否则路由会先执行,中间件就不会被触发。
- 必须调用next():除非你在中间件里直接返回响应(比如权限验证失败时返回403),否则一定要调用
next()让请求继续流转,否则客户端会一直处于等待状态。
内容的提问来源于stack exchange,提问作者sleatrou
相关产品推荐
相关产品推荐

