详解用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 相关文章推荐
兼容多浏览器的字幕特效Marquee的通用js类
Jul 20 Javascript
发一个自己用JS写的实用看图工具实现代码
Jul 26 Javascript
在JavaScript中监听IME键盘输入事件
May 29 Javascript
js右下角弹出提示框示例代码
Jan 12 Javascript
JavaScript代码生成PDF文件的方法
Feb 26 Javascript
前端编码规范(3)JavaScript 开发规范
Jan 21 Javascript
原生JS与jQuery编写简单选项卡
Oct 30 jQuery
ES6 javascript中Class类继承用法实例详解
Oct 30 Javascript
Js经典案例的实例代码
May 10 Javascript
基于vue实现web端超大数据量表格的卡顿解决
Apr 02 Javascript
对vue生命周期的深入理解
Dec 03 Vue.js
原生JS中应该禁止出现的写法
May 05 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
php 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
PHP学习笔记之二 php入门知识
2011/01/12 PHP
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
PHP中文乱码解决方案
2015/03/05 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
CakePHP框架Model函数定义方法示例
2017/08/04 PHP
js几个不错的函数 $$()
2006/10/09 Javascript
Javascript 判断Flash是否加载完成的代码
2010/04/12 Javascript
兼容IE与firefox火狐的回车事件(js与jquery)
2010/10/20 Javascript
jquery模拟按下回车实现代码
2011/09/20 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
2014/03/18 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
JS实现控制表格内指定单元格内容对齐的方法
2015/03/30 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
2016/10/11 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
Nodejs处理异常操作示例
2018/12/25 NodeJs
Angular6使用forRoot() 注册单一实例服务问题
2019/08/27 Javascript
[55:03]LGD vs EG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python使用urllib2模块获取gravatar头像实例
2013/12/18 Python
Python实现过滤单个Android程序日志脚本分享
2015/01/16 Python
python3 读取Excel表格中的数据
2018/10/16 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
2012/12/13 HTML / CSS
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
求职推荐信范文
2013/12/01 职场文书
食堂个人先进事迹
2014/01/22 职场文书
烹饪大赛策划方案
2014/05/26 职场文书
班主任2015新年寄语
2014/12/08 职场文书
教师辞职信范文
2015/02/28 职场文书
2015年推普周活动总结
2015/03/27 职场文书
大学生读书笔记大全
2015/07/01 职场文书