详解用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 相关文章推荐
让您的菜单不离网站
Oct 03 Javascript
用javascript实现页面打印的三种方法
Mar 05 Javascript
js用图作提交按钮或超连接
Mar 26 Javascript
js时间比较示例分享(日期比较)
Mar 05 Javascript
把jQuery的类、插件封装成seajs的模块的方法
Mar 12 Javascript
JS实现控制表格内指定单元格内容对齐的方法
Mar 30 Javascript
基于ajax与msmq技术的消息推送功能实现代码
Dec 26 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
Apr 25 jQuery
详解ECMAScript6入门--Class对象
Apr 27 Javascript
利用node 判断打开的是文件 还是 文件夹的实例
Jun 10 Javascript
详解vue中的父子传值双向绑定及数据更新问题
Jun 13 Javascript
关于vue中如何监听数组变化
Apr 28 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 imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
2013/11/07 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
php数据库备份还原类分享
2014/03/20 PHP
php环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
YII分模块加载路由的实现方法
2018/10/01 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
一些易混淆且不常用的属性,希望有用
2007/01/29 Javascript
DOM下的节点属性和操作小结
2009/05/14 Javascript
Dom操作之兼容技巧分享
2011/09/20 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
玩转方法:call和apply
2014/05/08 Javascript
JavaScript onkeydown事件入门实例(键盘某个按键被按下)
2014/10/17 Javascript
js中confirm实现执行操作前弹出确认框的方法
2014/11/01 Javascript
angularjs表格分页功能详解
2016/01/21 Javascript
微信小程序侧边栏滑动特效(左右滑动)
2017/01/23 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
Python+django实现简单的文件上传
2016/08/17 Python
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
使用Python制作自动推送微信消息提醒的备忘录功能
2018/09/06 Python
python获取微信小程序手机号并绑定遇到的坑
2018/11/19 Python
html5应用缓存_动力节点Java学院整理
2017/07/13 HTML / CSS
abstract是什么意思
2012/02/12 面试题
活动策划邀请函
2014/02/06 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
检讨书格式
2015/01/23 职场文书
入党个人总结范文
2015/03/02 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书