node-mitm教程:用IncomingMessage与ServerResponse零成本模拟HTTP/HTTPS响应

发布时间:2026/10/8 13:04:30

node-mitm教程:用IncomingMessage与ServerResponse零成本模拟HTTP/HTTPS响应 node-mitm教程用IncomingMessage与ServerResponse零成本模拟HTTP/HTTPS响应【免费下载链接】node-mitmIntercept and mock outgoing Node.js network TCP connections and HTTP requests for testing. Intercepts and gives you a Net.Socket, Http.IncomingMessage and Http.ServerResponse to test and respond with. Super useful when testing code that hits remote servers.项目地址: https://gitcode.com/gh_mirrors/no/node-mitmnode-mitm 是一款专为 Node.js 设计的网络请求模拟Mock工具能够拦截并模拟出站的 TCP 连接与 HTTP/HTTPS 请求。本教程面向新手带你用 Node.js 自带的Http.IncomingMessage与Http.ServerResponse零成本模拟 HTTP/HTTPS 响应从此告别外部测试服务器让单元测试又快又稳。node-mitm 是什么为什么测试需要它写过 Node.js 服务端测试的朋友都经历过这样的烦恼为了测试一段会请求远程 API 的代码得先启动一个 Express 或 Nginx 测试服务器处理端口占用、证书校验、网络波动测试又慢又不稳定。node-mitm 的出现彻底改变了这一点。它在 Node.js 最底层 Hook 了Net.connect、Http.request和Https.request核心逻辑见项目入口 index.js当你的代码发起网络请求时请求根本不会离开进程而是被直接递到你的手里——就像你同时扮演了客户端和服务端两个角色。拦截级别触发事件回调参数TCP 连接connect客户端Net.Socket 连接选项TCP 连接connection服务端Net.Socket 连接选项HTTP/HTTPS 请求requestIncomingMessageServerResponse最贴心的是你不需要学习任何新的 API。IncomingMessage和ServerResponse就是你平时写 Node.js HTTP 服务器时用的那对对象用法一模一样。快速安装与启用 node-mitm两条命令上手 安装只需要一行命令npm 包名为mitmnpm install mitm启用拦截更是简单只需两行代码var Mitm require(mitm) var mitm Mitm() // 创建实例并立即开始拦截所有出站请求想停止拦截调用mitm.disable()即可恢复一切mitm.disable()从这一刻起你的代码里所有发往外部服务器的 HTTP/HTTPS 请求都会被 node-mitm 接管静候你的指令。监听 request 事件拦截 HTTP/HTTPS 请求的第一步 node-mitm 拦截 HTTP/HTTPS 请求的核心是request事件。每当你代码中发起一次 HTTP 或 HTTPS 请求node-mitm 就会在自身实例上触发一次request事件并交出服务端的IncomingMessage请求对象和ServerResponse响应对象mitm.on(request, function(req, res) { // req 是 Http.IncomingMessage // res 是 Http.ServerResponse })这与你在 Express 中写中间件的感觉几乎一致学习成本几乎为零。用 IncomingMessage 读取请求URL、请求头与请求体 作为模拟的服务端你当然要先看清楚客户端发来了什么。IncomingMessage提供了完整的请求信息适合用来断言请求参数是否正确。读取请求 URL 和请求头mitm.on(request, function(req, res) { console.log(req.url) // /user/123 console.log(req.method) // GET console.log(req.headers) // { host: example.org, ... } })读取 POST 请求体流式读取mitm.on(request, function(req, res) { req.setEncoding(utf8) req.on(data, function(chunk) { // chunk 就是请求体内容 }) })巧妙的小细节在request事件中req与res互为引用——req.res res、res.req req见 index.js 中的addCrossReferences排查问题时非常方便。用 ServerResponse 模拟 HTTP 响应从 200 到 5xx 模拟响应是 node-mitm 最爽的部分。设置状态码、响应头、响应体然后end()一气呵成。模拟一个 JSON 成功响应200mitm.on(request, function(req, res) { res.statusCode 200 res.setHeader(Content-Type, application/json) res.end(JSON.stringify({ ok: true, user: Alice })) })模拟 404 与 500 错误响应mitm.on(request, function(req, res) { if (req.url /not-found) { res.statusCode 404 res.end(Not Found) } else { res.statusCode 500 res.end(Server Error) } })模拟延迟响应测试超时处理mitm.on(request, function(req, res) { setTimeout(function() { res.statusCode 200 res.end(Slow response) }, 3000) })客户端的代码无需任何改动照常通过response事件接收这些响应——你的业务代码根本感知不到服务器是假的测试因此变得极其真实。模拟 HTTPS 请求响应零证书零成本的原理 HTTPS 请求通常需要处理证书这常常是测试中最头疼的部分。node-mitm 的做法非常巧妙它会将 HTTPS 请求变形为 HTTP 请求来处理从而省去设置证书和关闭证书校验的麻烦。也就是说你代码里发往https://api.example.com的请求同样会被request事件拦截var Https require(https) Https.get(https://api.example.com/user, function(res) { res.setEncoding(utf8) res.on(data, console.log) // 打印模拟的响应数据 }) mitm.on(request, function(req, res) { res.statusCode 200 res.end(Fake HTTPS response!) })无需配置任何 TLS 证书、无需修改业务代码这就是零成本模拟 HTTPS 响应的秘密。在 Mocha 测试中集成 node-mitmbeforeEach 与 afterEach 的最佳实践 ✅把 node-mitm 接入测试框架非常自然。官方推荐在beforeEach中启用拦截、在afterEach中关闭拦截保证每个测试用例互不干扰var Mitm require(mitm) describe(用户服务, function() { beforeEach(function() { this.mitm Mitm() // 每个用例前开启拦截 }) afterEach(function() { this.mitm.disable() // 每个用例后恢复网络 }) it(请求失败时应返回错误, function(done) { this.mitm.on(request, function(req, res) { res.statusCode 500 res.end(boom) }) fetchUser().catch(function(err) { // 断言业务代码正确处理了 500 done() }) }) })完整测试用例可参考项目中的 test/index_test.js覆盖了请求断言、响应模拟、keep-alive 等大量真实场景。选择性绕过拦截让真实请求直连网络 有些场景下你希望拦截绝大多数请求但放行少数真请求——比如直连测试进程内的本地服务、或访问数据库。node-mitm 为此提供了bypass机制监听connect事件对符合条件的 socket 调用bypass()即可mitm.on(connect, function(socket, opts) { if (opts.host localhost) socket.bypass() // 放行本地请求 if (opts.host sql.example.org opts.port 5432) socket.bypass() // 放行数据库 })被bypass()的连接不会触发connection和request事件会像什么都没发生一样正常联网。总结让网络测试回归简单 ✨node-mitm 用进程内拦截的思路把测试外部服务这件事从搭环境变成了写两行代码✅ 零外部依赖不需要启动真实服务器✅ 零证书成本HTTPS 自动变形为 HTTP 处理✅ 零学习成本使用熟悉的IncomingMessage与ServerResponse✅ 速度快请求不出进程测试毫秒级完成✅ 可选择性绕过该放行的放行该拦截的拦截如果你也想深入了解它的实现细节socket 对、stub 机制等可以阅读源码目录 lib/socket.js、lib/internal_socket.js 和 lib/stubs.js。需要获取源码仓库时可以执行git clone https://gitcode.com/gh_mirrors/no/node-mitm希望这篇 node-mitm 教程能帮你快速上手模拟 HTTP/HTTPS 响应让测试从此又快又稳【免费下载链接】node-mitmIntercept and mock outgoing Node.js network TCP connections and HTTP requests for testing. Intercepts and gives you a Net.Socket, Http.IncomingMessage and Http.ServerResponse to test and respond with. Super useful when testing code that hits remote servers.项目地址: https://gitcode.com/gh_mirrors/no/node-mitm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/5 22:49:20

从零理解事件驱动回测引擎:quanttrader核心源码逐行解析

从零理解事件驱动回测引擎:quanttrader核心源码逐行解析 【免费下载链接】quanttrader Backtest and live trading in Python 项目地址: https://gitcode.com/gh_mirrors/qu/quanttrader 量化交易圈里,「事件驱动回测引擎」是绕不开的高频词&…

2026/10/8 13:00:47

TPS259483AYWPR+ATmega32构建智能电源路径保护系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 13:00:47

eFuse+MCU实现智能电源保护:基于TPS259483与MK24FN256VDC12的设计

板子第一次上电,我最紧张的不是代码编译不过,而是电源路径上哪个小角落突然冒烟。做嵌入式这几年,挨过的板子多了之后你会发现,MCU再聪明、传感器再贵,电源一旦出问题,前面的努力全白费。这次项目核心就一件…

2026/10/8 13:00:47

连锁店管理系统:多门店数字化协同的选型思考

2026年实体连锁行业调研显示,超过六成多门店品牌正遭遇渠道数据割裂的现实难题,线下门店、线上小程序、外卖平台的经营数据相互独立,总部很难完整掌握每家门店真实经营状态。连锁店管理系统的核心价值,就是打通分散的业务节点&…

2026/10/8 13:00:47

Pi 的 Rust 实现来了:rpi,不止一个终端 Agent

如果你熟悉 Pi,rpi 可以理解为它的 Rust 实现:同样能在终端里读文件、改代码、执行命令,也能作为库嵌入自己的程序。 rpi 用 Rust 重新实现 Pi SDK,并在这套运行时之上提供终端 CLI 和原生扩展。 想直接使用编码助手,…

2026/10/8 12:55:47

拯救者花屏报43错误别急着换主板:先软后硬排查指南

1. 拯救者花屏报43错误,为什么我第一反应不是换主板拯救者系列游戏本用久了,花屏和显卡报43错误算是比较典型的一类故障。很多人一看到屏幕出现彩色条纹、画面撕裂,或者设备管理器里显卡旁边挂个黄色感叹号、属性里写着“该设备有问题&#x…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 0:02:17

自然数立方等于连续奇数之和:从证明到编程验证

十几年来我一直游走在数学科普和编程教学这两块内容之间,对“看起来像魔法、拆开全是数学”的结论总是格外敏感。最近翻资料时又撞见一句话:任何一个自然数 m 的立方,都可以写成 m 个连续奇数之和。2 的立方等于 3 加 5,3 的立方等…

2026/10/8 0:02:17

C#上位机SSH连接实战:用SSH.NET补齐超时、批量与密钥认证

简介:这是一份基于 C# 开发的 SSH 连接功能半成品工程,原本作为另一个主项目的子功能模块,现独立打包分享。工程采用 WinForms 界面,包含源码、解决方案、安装部署工程、NuGet 依赖包及说明文档,适合正在做远程连接、网…

2026/10/8 0:02:17

Java SpringBoot一体化智能售后系统设计与实现全解析

毕业设计年年做,Java Web 方向的题目翻来覆去就那么几个,但“一体化智能售后系统”这个题,每次看到我都觉得值得认真聊一聊。它不是一个简单 curd 堆出来的管理系统,而是把客户、工单、派单、处理、回访、统计整条链路串起来的一套…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑