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

Express中间件参数疑问:req、res对象来源与属性解析

理解Express中间件里的req、res对象:它们真的不是空的!

嘿,我完全懂你的困惑——刚摸Express中间件时,很容易误以为req和res是凭空冒出来的空对象,但其实它们是Express帮你封装好的核心请求/响应实例,功能超全!

先给你划两个核心重点:

  • req和res绝对不是空对象,它们是Express在客户端请求到达时自动创建的实例
  • 整个中间件链里的req和res都是同一个对象,会在各个中间件之间接力传递

这些对象和属性到底从哪来?

当用户的HTTP请求(比如浏览器发的GET/POST请求)打到你的Express服务器时,Express会悄悄做这些事:

  1. 解析原始的HTTP请求报文(包括URL、请求方法、请求头、请求体等一堆细碎信息)
  2. 创建req(request)对象,把所有解析后的请求信息都挂载成它的属性——比如你看到的req.originalUrl就是原始请求的完整URL,req.method是请求的HTTP方法(GET/POST等),还有req.params、req.query这些常用属性都是这么来的
  3. 创建res(response)对象,挂载了一堆用来构建HTTP响应的工具方法和属性,比如res.send()用来快速发送响应内容,res.status()用来设置响应状态码,res.json()用来返回JSON格式响应

结合你给的官方示例再拆解下

app.use('/user/:id', 
  function (req, res, next) { 
    console.log('Request URL:', req.originalUrl) 
    next() 
  }, 
  function (req, res, next) { 
    console.log('Request Type:', req.method) 
    next() 
  }
)
  • 第一个中间件里的req.originalUrl:是Express从请求报文中提取的完整URL,不用你自己去啃原始的HTTP数据
  • 第二个中间件里的req.method:同样是Express帮你解析好的HTTP请求方法
  • 两个中间件里的req和res是同一个对象——如果你在第一个中间件里给req加个自定义属性,比如req.user = 'Ben',第二个中间件里也能直接拿到req.user的值
  • next()的作用就像你理解的,把请求的控制权传递给下一个中间件(或者后续的路由处理器)

补充个实用小细节

你可以在中间件里随意修改req或res对象,比如给req添加自定义业务数据,或者给res设置响应头,这些修改会沿着中间件链一直传递下去,直到最终发送响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:55:44