详解用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 相关文章推荐
js禁止页面使用右键(简单示例代码)
Nov 13 Javascript
Javascript改变CSS样式(局部和全局)
Dec 18 Javascript
js动态调用css属性的小规律及实例说明
Dec 28 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
Jan 28 Javascript
jQuery中change事件用法实例
Dec 26 Javascript
JavaScript中标识符提升问题
Jun 11 Javascript
jQuery实现选项卡切换效果简单演示
Dec 09 Javascript
理解javascript对象继承
Apr 17 Javascript
jQuery中fadein与fadeout方法用法示例
Sep 16 Javascript
JS基于封装函数实现的表格分页完整示例
Jun 26 Javascript
vue 自定义提示框(Toast)组件的实现代码
Aug 17 Javascript
浅谈vue中$bus的使用和涉及到的问题
Jul 28 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
基于文本的留言簿
2006/10/09 PHP
PHP 采集程序 常用函数
2008/12/18 PHP
PHP实现上传文件并存进数据库的方法
2015/07/16 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
Laravel多域名下字段验证的方法
2019/04/04 PHP
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
2010/03/16 Javascript
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
JS获取URL中参数值(QueryString)的4种方法分享
2014/04/12 Javascript
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
2014/08/20 Javascript
IE8中动态创建script标签onload无效的解决方法
2014/12/22 Javascript
jquery事件的ready()方法使用详解
2015/11/11 Javascript
js+css实现select的美化效果
2016/03/24 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
JS验证码实现代码
2017/09/14 Javascript
p5.js实现斐波那契螺旋的示例代码
2018/03/22 Javascript
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
Layui组件Table绑定行点击事件和获取行数据的方法
2018/08/19 Javascript
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
Python pickle模块用法实例
2015/04/14 Python
python批量查询、汉字去重处理CSV文件
2018/05/31 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
详解python 中in 的 用法
2019/12/12 Python
收集的22款给力的HTML5和CSS3帮助工具
2012/09/14 HTML / CSS
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
英国女性时尚品牌:Apricot
2018/12/04 全球购物
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
2015/07/16 面试题
职业培训师职业生涯规划
2014/02/18 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
2015年七七事变78周年纪念活动方案
2015/05/06 职场文书
银行求职信范文
2019/05/13 职场文书
教你win10系统中APPCRASH事件问题解决方法
2022/07/15 数码科技