详解用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 相关文章推荐
juqery 学习之三 选择器 可见性 元素属性
Nov 25 Javascript
js保留小数点后几位的写法
Jan 03 Javascript
Javscript调用iframe框架页面中函数的方法
Nov 01 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
Sep 15 Javascript
js格式化输入框内金额、银行卡号
Feb 01 Javascript
jquery获取所有选中的checkbox实现代码
May 26 Javascript
js中利用cookie实现记住密码功能
Aug 20 Javascript
JavaScript函数节流和函数防抖之间的区别
Feb 15 Javascript
javascript设计模式之策略模式学习笔记
Feb 15 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
Sep 29 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
Nov 07 Javascript
vue的项目如何打包上线
Apr 13 Vue.js
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
php escape URL编码
2008/12/10 PHP
php如何调用webservice应用介绍
2012/11/24 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
2011/07/31 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
2013/12/19 Javascript
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
jQuery实现锚点scoll效果实例分析
2015/03/10 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
jquery层级选择器的实现(匹配后代元素div)
2016/09/05 Javascript
jQuery css() 方法动态修改CSS属性
2016/09/25 Javascript
Vue.js创建Calendar日历效果
2016/11/03 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
JS函数节流和函数防抖问题分析
2017/12/18 Javascript
angularjs 的数据绑定实现原理
2018/07/02 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
原生js实现随机点名
2020/07/05 Javascript
swiper4实现移动端导航栏tab滑动切换
2020/10/16 Javascript
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
pygame实现非图片按钮效果
2019/10/29 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
Python pymysql模块安装并操作过程解析
2020/10/13 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
《长江之歌》教学反思
2014/04/17 职场文书
2014年教师节演讲稿
2014/09/03 职场文书
2015年小学教师培训工作总结
2015/07/21 职场文书
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript