详解用node.js实现简单的反向代理

发布时间 - 2026-01-11 02:03:43    点击率:

之前用node.js实现简单的反向代理,最近需要回顾,就顺便发到随笔上了

不多说直接上代码!

const http = require('http');
const url = require('url');
const querystring = require('querystring');


http.createServer(function(oreq, ores) {
  console.log("服务已开启");
  if (oreq) {
    if (oreq.url !== '/favicon.ico') {
      let content = '',
        postData = '';
      // 封装获取参数的方法
      function getParmas(oUrl) {
        let oQuery = (typeof oUrl === "object") ? oUrl : url.parse(oUrl, true).query,
          data = {};
        for (item in oQuery) {
          if (item !== 'hostname') {
            if (item !== 'path') {
              data[item] = oQuery[item];
            }
          }
        }
        return querystring.stringify(data);
      };
      // 封装发起http请求的方法
      function httpRequest(options, ores) {
        let datas = "";
        return http.request(options, function(res) {
          res.setEncoding('utf8');
          res.on('data', function(chunk) {
            // 返回数据
            datas += chunk;
          });
          res.on('end', function() {
            ores.writeHead(200, {
              "Content-Type": "application/json; charset = UTF-8",
              "Access-Control-Allow-Origin": "*"
            });
            ores.end(datas);
          })
        })
      };
      // 数据块接收中
      console.log(oreq.method.toUpperCase());
      if (oreq.method.toUpperCase() === "POST") {
        console.log("进入POST");
        oreq.on("data", function(postDataChunk) {
          postData += postDataChunk;
        });
        // 数据接收完毕,执行回调函数
        oreq.on("end", function() {
          console.log("接收完毕")
          console.log(postData);
            // 配置options
          let oData = JSON.parse(postData);

          postData = getParmas(oData);

          let options = {
            hostname: oData.hostname,
            port: '80',
            path: oData.path,
            method: "POST"
          };
          // 发送请求
          let req = httpRequest(options, ores);
          req.on('error', function(e) {
            console.log('problem with request: ' + e.message);
          });
          req.write(postData); //发送请求数据
          req.end();
        });

      } else {
        let queryObj = url.parse(oreq.url, true).query;
        content = getParmas(oreq.url);
        let options = {
          hostname: queryObj.hostname,
          port: '80',
          path: queryObj.path + content,
          method: "GET"
        };
        // 发送请求
        let req = httpRequest(options, ores);
        req.on('error', function(e) {
          console.log('problem with request: ' + e.message);
        });
        req.end();
      }
    }
  }
}).listen(8080, '127.0.0.1');

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# nodejs  # 反向代理  # 实现反向代理  # node  # 抛弃Nginx使用nodejs做反向代理服务器  # Node.js站点使用Nginx作反向代理时配置GZip压缩的教程  # 腾讯云(ubuntu)下安装 nodejs + 实现 Nginx 反向代理服务器  # Linux安装NodeJs并配合Nginx实现反向代理  # 利用node.js实现反向代理的方法详解  # 上了  # 多说  # 回调  # 大家多多  # typeof  # object  # oQuery  # postData  # content  # oUrl  # getParmas  # path  # hostname  # stringify  # return  # item  # true  # parse  # data  # query 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: MySQL查询结果复制到新表的方法(更新、插入)  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  如何快速使用云服务器搭建个人网站?  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  如何生成腾讯云建站专用兑换码?  Swift中循环语句中的转移语句 break 和 continue  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  专业商城网站制作公司有哪些,pi商城官网是哪个?  Python制作简易注册登录系统  JavaScript如何实现错误处理_try...catch如何捕获异常?  如何在阿里云虚拟服务器快速搭建网站?  在线教育网站制作平台,山西立德教育官网?  如何撰写建站申请书?关键要点有哪些?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  如何在七牛云存储上搭建网站并设置自定义域名?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  如何正确选择百度移动适配建站域名?  googleplay官方入口在哪里_Google Play官方商店快速入口指南  利用vue写todolist单页应用  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  如何在Windows环境下新建FTP站点并设置权限?  bootstrap日历插件datetimepicker使用方法  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Laravel如何升级到最新版本?(升级指南和步骤)  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  如何在云主机快速搭建网站站点?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  简单实现jsp分页  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  怎么用AI帮你设计一套个性化的手机App图标?  用v-html解决Vue.js渲染中html标签不被解析的问题  Laravel如何保护应用免受CSRF攻击?(原理和示例)  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  如何制作一个表白网站视频,关于勇敢表白的小标题?  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Java解压缩zip - 解压缩多个文件或文件夹实例  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  BootStrap整体框架之基础布局组件  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  如何实现建站之星域名转发设置?  高防服务器租用如何选择配置与防御等级?  三星网站视频制作教程下载,三星w23网页如何全屏?