当前位置: 首页 > news >正文

用 Node.js 原生 API 写个本地代理,解决跨域烦恼

用 Node.js 原生 API 写个本地代理,解决跨域烦恼

前后端分离开发时,最让人头疼的往往不是业务逻辑,而是浏览器的同源策略。前端跑在localhost:3000,后端在localhost:8080,一旦前端发起 AJAX 请求,控制台立马飘红,CORS 报错拦路。

很多同事为了省事,直接在后台配置Access-Control-Allow-Origin: *。这在本地调试没问题,但上线前如果忘了收回来,生产环境就是个大漏洞。与其在两边反复横跳改配置,不如在本地起个轻量级的代理网关。用 Node.js 原生http模块就能写,零依赖,还能顺便把请求头给洗了。

为什么需要这个代理

本地开发时,前后端端口不同,浏览器默认禁止跨域访问。

如果不做处理,前端请求会被拦截。如果为了图方便在后端直接放行所有跨域,又会给生产环境埋下 XSS 隐患。更麻烦的是,没有中间层,你很难统一查看请求的转发耗时,排查问题全靠猜。

这个代理的作用很简单:前端请求先发给它,它再转给后端。浏览器以为是在跟同源服务器通信,自然就放行了。

代理是怎么工作的

流程并不复杂,核心就是“截获 - 重写 - 转发”。

  1. 截获请求:前端请求localhost:9000,代理程序接收到。
  2. 重写头部:把OriginHost等头部改成后端能识别的样子,避免后端微服务因为校验 Origin 而拒绝请求。
  3. 转发请求:代理向后端localhost:8080发起真实的 HTTP 请求。
  4. 注入响应头:拿到后端返回的数据后,手动加上Access-Control-Allow-Origin: *等跨域头。
  5. 返回前端:把处理好的数据流式写回给前端。

如果后端 5 秒内没反应,代理直接返回 504,避免前端页面卡死。

代码实现

下面这个脚本完全基于 Node.js 原生httpurl模块,没有引入http-proxy-middleware这种第三方包。代码量不大,但包含了超时控制、流式转发和基础的路由处理。

// dev_proxy_gateway.js const http = require('http'); const url = require('url'); const TARGET_API_SERVER = 'http://127.0.0.1:8080'; // 后端真实地址 const PROXY_PORT = 9000; // 代理监听端口 function logging(msg) { console.log(`\x1b[36m[Proxy] ${msg}\x1b[0m`); } const server = http.createServer((req, res) => { logging(`${req.method} ${req.url}`); // 1. 处理 OPTIONS 预检请求 if (req.method === 'OPTIONS') { res.writeHead(204, { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type, Authorization', 'Access-Control-Max-Age': '86400' }); return res.end(); } // 2. 构造转发请求 const parsedTarget = url.parse(TARGET_API_SERVER); const options = { hostname: parsedTarget.hostname, port: parsedTarget.port, path: req.url, method: req.method, headers: { ...req.headers, host: `${parsedTarget.hostname}:${parsedTarget.port}`, origin: TARGET_API_SERVER, referer: TARGET_API_SERVER }, timeout: 5000 // 5 秒超时 }; // 3. 发起代理请求 const proxyReq = http.request(options, (proxyRes) => { // 注入跨域头 res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); res.writeHead(proxyRes.statusCode, proxyRes.headers); // 4. 流式透传数据 proxyRes.pipe(res); }); // 5. 错误与超时处理 proxyReq.on('error', (err) => { logging(`Error: ${err.message}`, 'error'); res.writeHead(504, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ error: 'Gateway Timeout: Backend unreachable.' })); }); proxyReq.on('timeout', () => { proxyReq.destroy(); res.writeHead(504, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ error: 'Gateway Timeout: Backend no response within 5s.' })); }); // 把前端的数据管道写入代理请求 req.pipe(proxyReq); }); server.listen(PROXY_PORT, () => { logging(`Proxy running on http://127.0.0.1:${PROXY_PORT}`); logging(`Forwarding to: ${TARGET_API_SERVER}`); });

几个需要注意的地方

这套方案虽然轻量,但在实际使用中也有几个局限性,得提前心里有数:

  1. 延迟问题:请求多了一层转发,理论上会增加几毫秒的延迟。但在本地环境下,这点损耗(通常 <5ms)相比解决跨域带来的便利,完全可以忽略。
  2. HTTPS 支持:如果前端项目强制 HTTPS,代理网关也得配自签名证书。本地调试建议在浏览器里直接允许“不安全连接”,没必要为了个开发工具去折腾复杂的证书链。
  3. 长连接支持:上面的代码只处理了普通的 HTTP 请求。如果项目里有 WebSocket 或 SSE(服务端推送),原生http模块不会自动升级协议。这时候需要显式监听upgrade事件,手动把 TCP socket 桥接过去,否则实时功能会失效。

总结

在本地起个 Node.js 代理,是解决跨域最稳妥的办法。它比在后端直接放行安全,比配 Nginx 轻量。代码不多,维护成本低,能帮你把精力从“为什么请求被拦截”这种琐事上解放出来,专心写业务逻辑。

http://www.jsqmd.com/news/1084306/

相关文章:

  • Windows 系统文件d3dx9_38.dll丢失找不到问题解决
  • Paperxie 课程论文智能写作分步教程:期末结课作业不用熬夜硬写
  • ArkUI(轮播图,图片)组件介绍
  • 2026无水印在线抠图教程!无需下载AI在线抠图,一键生成高清透明底图片
  • 从YOLOv5部署实践,深入理解智能计算系统分层架构与优化
  • DevCloud 预置镜像避坑指南与 ROCm 版本锁定
  • 跨平台绘图新选择:如何用免费工具彻底告别Visio依赖
  • Windows系统文件d3dx9_41.dll丢失找不到问题解决
  • 9大网盘直链下载助手完整指南:一键获取真实下载地址,告别限速烦恼
  • 伴随诊断抗体如何实现精准医疗的技术突破?
  • 京东智能评价终极指南:5分钟实现自动化评价管理
  • 短信平台的数据监控架构设计
  • 2026年全链路性能测试:从场景仿真到平台化构建的实战指南
  • JL-34 超声波一体式气象站 轻松搞定多要素环境监测
  • 低成本单相电计量方案:HLW8032+ESP32实现
  • 在windows平台上,dbghlp和ASAN两种方式定位崩溃问题
  • [特殊字符] 刷爆前端圈!Qwythos-9B 震撼发布:4GB 显存畅玩 104 万超长上下文,真“无审查”平替 Claude?
  • 2026AI抠图工具保姆级教程:免费在线+电脑端+手机端全覆盖,新手零失败
  • Blender UV编辑终极指南:UvSquares插件让复杂网格一键变规整
  • 告别文字墙!TokUI让AI渲染像刷短视频一样丝滑
  • 编写 Python 脚本快速诊断 AMD GPU 健康状态
  • 口碑超棒!这家电动无轨龙门架制造厂家究竟有何过人之处?
  • 蛋仔网:独立游戏资源网站怎么选,授权和来源先看清
  • 告别重复编码!用Live Templates将日志/DTO/Controller生成速度提升300%(实测数据)
  • Unity基础:认识Unity引擎——从游戏引擎概念到Unity发展历程
  • vLLM 在 ROCm 7.x 下的显存参数精细调优实战
  • SillyTavern架构演进:3种战略迁移方案与技术评估指南
  • RAG 检索方式全解析:关键词、向量、混合检索与 Rerank
  • Linux嵌入式x86/ARM中的Bootloader基本概念与启动流程解析
  • 40 英镑的 Xteink X4 电子墨水阅读器:小巧便携,自定义固件让阅读体验升级!