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


Posted in Javascript onJune 26, 2017

之前用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');

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

Javascript 相关文章推荐
JavaScript关于select的相关操作说明
Jan 13 Javascript
Javascript MVC框架Backbone.js详解
Sep 18 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
May 21 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
May 25 Javascript
jQuery根据name属性进行查找的用法分析
Jun 23 Javascript
EasyUI加载完Html内容样式渲染完成后显示
Jul 25 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
Oct 25 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
Feb 14 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
Mar 06 Javascript
深入理解Angular.JS中的Scope继承
Jun 04 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
Dec 14 Javascript
基于JS实现一个随机生成验证码功能
May 29 Javascript
JS作用域链详解
Jun 26 #Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
Jun 26 #jQuery
纯JS实现简单的日历
Jun 26 #Javascript
vue2.0全局组件之pdf详解
Jun 26 #Javascript
JavaScript创建对象的七种方式(推荐)
Jun 26 #Javascript
基于 webpack2 实现的多入口项目脚手架详解
Jun 26 #Javascript
JavaScript的六种继承方式(推荐)
Jun 26 #Javascript
You might like
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
SONY ICF-F10中波修复记
2021/03/02 无线电
PHP数组循环操作详细介绍 附实例代码
2013/02/03 PHP
php中用memcached实现页面防刷新功能
2014/08/19 PHP
php跨服务器访问方法小结
2015/05/12 PHP
PHP实现的DES加密解密封装类完整实例
2017/04/29 PHP
PHP中的self关键字详解
2019/06/23 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
js选取多个或单个元素的实现代码(用class)
2012/08/22 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
一个js控制的导航菜单实例代码
2013/12/03 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
input输入框内容实时监测(附代码)
2017/08/15 Javascript
js实现弹幕飞机效果
2020/08/27 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
Python中__new__与__init__方法的区别详解
2015/05/04 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
Python Flask框架扩展操作示例
2019/05/03 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
美国在线奢侈品寄售商店:Luxury Garage Sale
2018/08/19 全球购物
用Python写一个for循环的例子
2016/07/19 面试题
通息工程毕业生自荐信
2013/10/16 职场文书
本科生职业生涯规划书范文
2014/01/21 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
承诺书样本
2014/08/30 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
党的群众路线教育实践活动调研报告
2014/11/03 职场文书
三八节祝酒词
2015/08/11 职场文书
Python实战之实现简易的学生选课系统
2021/05/25 Python
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers