Node.js(Express4)如何在端点请求响应发出前完成拦截
实现方案
你的项目用的是Express风格的响应写法(res.status().json()链式调用),最无侵入的实现方式是提前重写响应对象的json方法,不需要修改任何现有控制器代码,完全适配现有处理链路。
核心原理
Express中间件按注册顺序执行,你只需要在所有业务路由、业务中间件之前注册一个自定义中间件,提前缓存原始的res.json方法,替换为带拦截逻辑的包装方法:当控制器调用json发送响应时,会先进入你的自定义逻辑,判断符合拦截条件(成功响应、指定接口路径)就触发自定义操作,最后再调用原始json方法把响应返回给客户端。
具体实现代码
1. 编写拦截中间件
import type { Request, Response, NextFunction } from 'express'; export function successResponseInterceptor( req: Request, res: Response, next: NextFunction ) { // 绑定上下文缓存原始json方法,避免this指向错误 const originalJsonMethod = res.json.bind(res); // 重写实例上的json方法 res.json = function (responseData: unknown) { // 判定条件:状态码为2xx成功,且匹配你需要拦截的接口规则 const isSuccessResponse = res.statusCode >= 200 && res.statusCode < 300; const isTargetEndpoint = req.path.match(/^\/api\/(order|user)/); // 替换成你要拦截的路径规则,不需要全局拦截的话可以调整判断逻辑 if (isSuccessResponse && isTargetEndpoint) { // 在这里写你的自定义操作,比如日志上报、数据同步、事件触发等 // 注意:如果自定义逻辑是异步且不需要等待执行完成,可以直接调用不用await,避免增加接口响应耗时 } // 执行原始响应逻辑,保证原有业务流程不受影响 return originalJsonMethod(responseData); }; next(); }
2. 注册中间件
重点:必须把这个中间件注册在所有业务路由、其他业务中间件之前,否则控制器先执行完、原始json方法已经被调用,拦截就会失效
import express from 'express'; const app = express(); // 第一步:注册响应拦截中间件 app.use(successResponseInterceptor); // 后续再注册其他内置中间件、业务路由 app.use(express.json()); app.use('/api', userRouter); app.use('/api', orderRouter); // ... 其他路由和错误处理中间件
适配说明
- 完全兼容你现有控制器的
return response.status(200).json(data)链式写法:res.status()会返回响应实例本身,最后调用的json就是你重写后的包装方法,不需要改任何现有业务代码 - 如果项目里有部分接口用
res.send()返回成功响应,只需要按照重写json的逻辑,同步缓存并重写res.send方法即可 - 如果不需要全局拦截,也可以把这个中间件单独挂载到指定路由上,灵活控制拦截范围
内容的提问来源于stack exchange,提问作者doDDy
相关产品推荐
相关产品推荐

