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

Express.js请求入口、中间件栈调用及响应拦截技术咨询

Express.js 核心机制问题解答

1. HTTP请求触发的第一个函数与中间件栈调用逻辑

  • 第一个被调用的是Express内部创建的请求监听函数,它作为Node.js http.createServer()的回调,负责初始化req/res对象,随后启动中间件栈的遍历流程。
  • 中间件栈的分步调用逻辑:
    • 每个中间件会接收req、res和next函数作为参数;
    • 当中间件主动调用next()时,会触发栈中下一个Layer对应的函数执行;
    • 若中间件未调用next(),栈的遍历会直接终止,后续函数不再执行;
    • 整个栈的所有函数共享同一个req和res对象,通过修改这两个对象的属性即可实现数据/状态的传递。

2. 路由回调数组的调用执行者

在app.get(path, [...middlewares], handler)示例中,负责按顺序调用数组内所有函数的是Express Router的run方法(内部通过next函数实现迭代)。当请求匹配到该路由对应的Layer时,Router会依次执行数组中的中间件,最后调用handler函数,每一步的切换都由next()触发。

3. req/res对象的创建位置

request和response对象是在Express的请求监听函数内部创建的:

  • 基于Node.js原生的http.IncomingMessage和http.ServerResponse进行封装;
  • Express会给原生对象扩展额外属性与方法(比如req.body、res.send),随后将封装后的对象传入中间件栈开始处理。

4. res.send的onfinish/onend回调与拦截器实现

  • onfinish/onend是Node.js原生ServerResponse对象的内置事件,直接绑定在res对象上即可监听。
  • 实现响应拦截的示例代码:
    app.use((req, res, next) => {
      // 保存原生send方法
      const originalSend = res.send;
      res.send = function(data) {
        // 在此处拦截响应数据并存入变量
        const responseData = data;
        // 调用原生send方法发送响应
        originalSend.call(this, data);
      };
    
      // 通过onfinish事件监听响应完成状态
      res.on('finish', () => {
        // 响应已完全发送给客户端,可在此处理后续逻辑
        console.log('响应发送完成');
      });
      next();
    });
    

请求入口与响应出口

  • 请求入口:Express应用启动后,Node.js的http.Server监听指定端口,当客户端请求到达时,触发app.listen()内部绑定的Express请求监听函数,这是请求进入应用处理流程的起点。
  • 响应出口:当中间件或路由handler调用res.send()、res.end()等方法时,最终会调用Node.js原生ServerResponse.end()发送响应,这是响应离开应用的终点;finish事件触发时,代表响应已完全传递给客户端。

内容的提问来源于stack exchange,提问作者Gary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:32:28