详解用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 获取页面元素的位置的代码
Sep 25 Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
Nov 05 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
Jan 22 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
Apr 25 Javascript
jQuery EasyUI datagrid实现本地分页的方法
Feb 13 Javascript
JavaScript使用function定义对象并调用的方法
Mar 23 Javascript
JS正则表达式判断有效数实例代码
Mar 13 Javascript
vuejs 单文件组件.vue 文件的使用
Jul 28 Javascript
深入理解Antd-Select组件的用法
Feb 25 Javascript
JavaScript中使用Spread运算符的八种方法总结
Jun 18 Javascript
Vue实现开关按钮拖拽效果
Sep 22 Javascript
ES6 十大特性简介
Dec 09 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
【动漫杂谈】关于《请在T台上微笑》
2020/03/03 日漫
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
2011/12/14 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
PHP curl批处理及多请求并发实现方法分析
2018/08/15 PHP
js实现的网页颜色代码表全集
2007/07/17 Javascript
用javascript实现给图片加链接
2007/08/15 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
iframe窗口高度自适应的实现方法
2014/01/08 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
完美实现仿QQ空间评论回复特效
2015/05/06 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
JS document对象简单用法完整示例
2020/01/14 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
2021/02/05 Javascript
简单介绍Python中的floor()方法
2015/05/15 Python
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
2016/11/19 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
利用python提取wav文件的mfcc方法
2019/01/09 Python
python 限制函数执行时间,自己实现timeout的实例
2019/01/12 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
基于python进行抽样分布描述及实践详解
2019/09/02 Python
python 连续不等式语法糖实例
2020/04/15 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
触发器(trigger)的功能都有哪些?写出一个触发器的例子
2012/09/17 面试题
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
外贸采购员求职的自我评价
2013/11/26 职场文书
党员个人思想汇报
2013/12/28 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书