如何理解Express.js中request对象打印出的额外属性?
解答
你在Express中间件中拿到的req对象,既不是MDN文档记载的浏览器端Web标准Request接口实例,也不是纯HTTP协议语义下的裸请求结构,它是Node.js原生http.IncomingMessage类的实例,经过Express框架二次扩展后的运行时对象。
你看到的属性按来源可以分成三类:
- 符合预期的
url、method这类属性,本身就是Node.js原生http.IncomingMessage的公开标准属性,语义和Web标准定义完全对齐,所以会和你认知里的请求属性匹配。 _readableState、_events这类下划线开头的属性,是Node.js底层类的内部状态字段。http.IncomingMessage本身继承自Node.js可读流(Readable Stream),而可读流又继承自EventEmitter事件基类,这些字段是底层用来维护缓存状态、事件监听队列、读取进度的内部成员,本来就不面向业务代码直接调用,自然不会出现在Web标准文档里。socket属性是当前HTTP请求对应的底层TCP套接字实例,属于Node.js网络层的实现对象,你可以通过它获取请求来源IP、TCP连接状态这类底层信息,是Node.js运行时层面的专属内容,不在Web标准的定义范围内。
除了上述原生属性之外,Express框架本身还会在这个对象上追加大量框架封装的属性,比如日常开发常用的req.query、req.params、req.path、req.body(需配合请求体解析中间件)等,这些也都是框架层面扩展的能力,不属于Web标准范畴。
调试建议:不要直接用
console.log(req)打印整个请求对象,它挂载的内部属性、原型链方法极多,会输出大量无意义的冗余信息。调试请求内容时,按需打印你关心的特定字段即可。
内容的提问来源于stack exchange,提问作者PatrickReagan
相关产品推荐
相关产品推荐

