详解用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 相关文章推荐
基于jquery自定义的漂亮单选按钮RadioButton
Nov 19 Javascript
JQuery中clone方法复制节点
May 18 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
Dec 31 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
Aug 29 Javascript
jquery控制页面的展开和隐藏实现方法(推荐)
Oct 15 Javascript
微信小程序 navbar实例详解
May 11 Javascript
node实现定时发送邮件的示例代码
Aug 26 Javascript
js 中rewrap-ajax.js插件实例代码
Oct 20 Javascript
JavaScript调用模式与this关键字绑定的关系
Apr 21 Javascript
微信小程序网络请求封装示例
Jul 24 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
Sep 29 Javascript
js实现点击生成随机div
Jan 16 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
PHP4与PHP5的时间格式问题
2008/02/17 PHP
一个很不错的PHP翻页类
2009/06/01 PHP
程序员编程十条戒律
2009/07/09 PHP
php连接odbc数据源并保存与查询数据的方法
2014/12/24 PHP
PHP面向对象程序设计之对象生成方法详解
2016/12/02 PHP
php操作access数据库的方法详解
2017/02/22 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
2015/01/24 Javascript
JavaScript重载函数实例剖析
2016/05/13 Javascript
js中字符型和数值型数字的互相转化方法(必看)
2017/04/25 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
如何在vue 中引入使用jquery
2020/11/10 jQuery
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
跟老齐学Python之集合的关系
2014/09/24 Python
利用python实现命令行有道词典的方法示例
2017/01/31 Python
python2.7 mayavi 安装图文教程(推荐)
2017/06/22 Python
python安装Scrapy图文教程
2017/08/14 Python
利用Python2下载单张图片与爬取网页图片实例代码
2017/12/25 Python
Django模板语言 Tags使用详解
2019/09/09 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
使用matplotlib的pyplot模块绘图的实现示例
2020/07/12 Python
美国领先的商务贺卡出版商:The Gallery Collection
2018/02/13 全球购物
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
2014年仓管员工作总结
2014/11/18 职场文书
2014年党风廉政建设工作总结
2014/11/19 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
认识实习感想
2015/08/10 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书