详解用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与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
Mar 12 Javascript
jquery EasyUI的formatter格式化函数代码
Jan 12 Javascript
jquery选择器之层级过滤选择器详解
Jan 27 Javascript
jQuery常用操作方法及常用函数总结
Jun 19 Javascript
深入理解javascript构造函数和原型对象
Sep 23 Javascript
JavaScript移除数组内重复元素的方法
Mar 18 Javascript
jQuery插件EnPlaceholder实现输入框提示文字
Jun 05 Javascript
基于Node.js实现nodemailer邮件发送
Jan 26 Javascript
js将json格式的对象拼接成复杂的url参数方法
May 25 Javascript
详解react-router4 异步加载路由两种方法
Sep 12 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
Nov 04 Javascript
使用React-Router实现前端路由鉴权的示例代码
Jul 26 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数组合并的二种方法
2014/03/21 PHP
WordPress中对访客评论功能的一些优化方法
2015/11/24 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
Yii实现微信公众号场景二维码的方法实例
2020/08/30 PHP
JavaScript中链式调用之研习
2011/04/07 Javascript
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
js文本框输入点回车触发确定兼容IE、FF等
2013/11/19 Javascript
调用jQuery滑出效果时闪烁的解决方法
2014/03/27 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
js实现一键复制功能
2017/03/16 Javascript
MUI  Scroll插件的使用详解
2017/04/13 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
Vuex mutitons和actions初使用详解
2019/03/04 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
layui复选框的全选与取消实现方法
2019/09/02 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
[04:44]DOTA2西游记战队视频彩蛋流出 师徒开黑巧遇林书豪
2016/08/03 DOTA
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
Python3编码问题 Unicode utf-8 bytes互转方法
2018/10/26 Python
keras 多gpu并行运行案例
2020/06/10 Python
Python把图片转化为pdf代码实例
2020/07/28 Python
基于Python模拟浏览器发送http请求
2020/11/06 Python
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
TripAdvisor德国:全球领先的旅游网站
2017/12/07 全球购物
妈妈活动方案
2014/08/15 职场文书
重阳节活动总结
2014/08/27 职场文书
银行奉献演讲稿
2014/09/16 职场文书
太行山上观后感
2015/06/05 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书