http实现反向代理

http实现反向代理
  • 需要安装http-proxy-middleware插件
js 复制代码
npm i http-proxy-middleware
  • 准备proxy.html, 等会加载proxy.html可直接发起fetch请求
js 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    有内容
    <script>
      // fetch 发起接口请求
      fetch("/api").then((res) => res.text());
    </script>
  </body>
</html>
  • 准备xxx.config.js配置文件,配置proxy代理
js 复制代码
module.exports = {
  serve: {
    proxy: {
      "/api": {
        target: "http://localhost:3000",  // 代理端口号到3000
        changeOrigin: true,
        rewrite:'相应的正则替换', // 可写可不写
      },
    },
  },
};
  • 准备proxyTest.js 代理node服务,服务端口号为3000
js 复制代码
const http = require("node:http");
const url = require("node:url");

http
  .createServer((req, res) => {
    // 接口路径带api的,则拦截提示返回成功 
    const { pathname } = url.parse(req.url);
    if (pathname === "/api") {
      res.end("代理 3000 成功");
    }
  })
  .listen(3000, () => {
    console.log("启动3000服务");
  });
  • 准备proxy.js 文件
js 复制代码
const fs = require("node:fs");
const http = require("node:http");
const url = require("node:url");
// 反向代理中间代码
const { createProxyMiddleware } = require("http-proxy-middleware");

// 获取html的内容,启动服务后可直接加载发起接口请求
const html = fs.readFileSync("./proxy.html");

// 获取配置文件里的serve配置内容
const config = require("./xxx.config.js");

http
  .createServer((req, res) => {
    // 获取url接口端口号后面的名称
    const { pathname } = url.parse(req.url);
    // 获取配置文件中的 配置 如 /api
    const proxyList = Object.keys(config.serve.proxy);

    // 若是请求的接口中包含代理配置的内容,进行反向代理
    if (proxyList.includes(pathname)) {
      const proxy = createProxyMiddleware(config.serve.proxy[pathname]);
      // 进行代理
      proxy(req, res);
      return;
    }
    // 把html内容与服务整合在一起
    res.writeHead(200, {
      "Content-Type": "text/html",
    });
    res.end(html);
  })
  .listen(8080, () => {
    console.log("启动了一个80服务");
  });
nodejs反向代理基本实现思路如上
相关推荐
Thanks_ks36 分钟前
Cookie 和 Session 到底是什么关系——登录态是怎么维持的
分布式·http·jwt·cookie·session·后端开发·登录态
Dumbness1 小时前
二十行手写的 SKILL.md 头部解析,遇到 YAML 的折叠写法、单引号和嵌套键就读错:和 js-yaml 逐条对照
node.js·ai编程
QianhangQianping1 小时前
WebSocket实时推送+ HTTP 定时轮询:一块大屏两套取数怎么不打架
前端·websocket·网络协议·http·低代码·架构·数据可视化
车载中间件通信2 小时前
[TC8测试]TCP_FLAGS_INVALID_13_Flag SYN,ACK
网络·网络协议·tcp/ip
车载中间件通信3 小时前
[TC8测试]TCP_FLAGS_PROCESSING_06
数据库·网络协议·tcp/ip·中间件·tc8
李纲明5 小时前
WordPress 全站 HTTPS 后仍显示「不安全」或锁被划掉:先清混合内容,再核证书链与强制跳转
网络协议·安全·https·wordpress·devdiy·混合内容
只睡四小时14 小时前
MCP 弃用 SSE?Node 分帧漏 81.7% 事件
node.js·webassembly·实时通信·mcp·streamable http
尹人入圣15 小时前
目前热门的IP驱动产业新场景新工具
网络·python·网络协议·tcp/ip
hey you~1 天前
个体户门店办理400电话,如何对接订单系统实现来电弹窗
node.js·webhook·400电话·门店数字化·来电弹窗·订单系统对接
IT古董1 天前
Modbus TCP 详解:工业设备通信协议与 MES 集成实战
网络·网络协议·tcp/ip