ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/8/16 15:46:54 拓冰建站 浏览量
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),仅供参考