详解用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之十 事件模块概述
Jun 27 Javascript
javascript检测浏览器flash版本的实现代码
Dec 06 Javascript
JS实现方向键切换输入框焦点的方法
Aug 19 Javascript
基于javascript实现图片懒加载
Jan 05 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
Jul 06 Javascript
Vue.js 插件开发详解
Mar 29 Javascript
基于 webpack2 实现的多入口项目脚手架详解
Jun 26 Javascript
微信小程序 五星评分的实现实例
Aug 04 Javascript
基于vue配置axios的方法步骤
Nov 09 Javascript
vue生成文件本地打开查看效果的实例
Sep 06 Javascript
layer弹出层自定义提交取消按钮的例子
Sep 10 Javascript
基于ajax及jQuery实现局部刷新过程解析
Sep 12 jQuery
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(2)
2006/10/09 PHP
php仿discuz分页效果代码
2008/10/02 PHP
url decode problem 解决方法
2011/12/26 PHP
php无限极分类实现的两种解决方法
2013/04/28 PHP
php数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
php实现的双色球算法示例
2017/06/20 PHP
PHP中检查isset()和!empty()函数的必要性
2019/02/13 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
2019/12/12 PHP
在网页里看flash的trace数据的js类
2009/01/10 Javascript
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
jstl中判断list中是否包含某个值的简单方法
2016/10/14 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
vue中 this.$set的用法详解
2019/09/06 Javascript
vue+iview实现文件上传
2020/11/17 Vue.js
[00:12]2018DOTA2亚洲邀请赛 Sccc亮相SOLO赛,今年他又会有什么样的战绩?
2018/04/06 DOTA
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python输出指定月份日历的方法
2015/04/23 Python
python更新列表的方法
2015/07/28 Python
Python使用Tkinter实现机器人走迷宫
2018/01/22 Python
Python字典创建 遍历 添加等实用基础操作技巧
2018/09/13 Python
Python中时间datetime的处理与转换用法总结
2019/02/18 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
世界上最好的足球商店:Unisport
2019/03/02 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
学校文明单位申报材料
2014/05/06 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
亲属关系公证书样本
2015/01/23 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书