You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 02:15:40