详解用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操作FRAME中的IFRAME及其内容的实现代码
Jul 26 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
Mar 21 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
Feb 05 Javascript
原生js实现日期计算器功能
Feb 17 Javascript
jQuery扩展_动力节点Java学院整理
Jul 05 jQuery
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
Aug 17 Javascript
JavaScript实现图片拖曳效果
Sep 08 Javascript
vue2+el-menu实现路由跳转及当前项的设置方法实例
Nov 07 Javascript
php中and 和 &&出坑指南
Jul 13 Javascript
JS中超越现实的匿名函数用法实例分析
Jun 21 Javascript
微信sdk实现禁止微信分享(使用原生php实现)
Nov 15 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
Oct 27 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 curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
javascipt:filter过滤介绍及使用
2014/09/10 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
使用D3.js制作图表详解
2017/08/13 Javascript
jquery实现左右轮播图效果
2017/09/28 jQuery
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
python抓取网页图片示例(python爬虫)
2014/04/27 Python
Python的IDEL增加清屏功能实例
2017/06/19 Python
python 不以科学计数法输出的方法
2018/07/16 Python
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
python查看文件大小和文件夹内容的方法
2019/07/08 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
html+css3实现的登录界面
2020/12/09 HTML / CSS
HTML5中的新元素介绍
2008/10/17 HTML / CSS
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
应届大学生自荐信格式
2013/09/21 职场文书
前台文员岗位职责及工作流程
2013/11/19 职场文书
蔬菜基地的创业计划书
2014/01/06 职场文书
违反课堂纪律检讨书
2014/01/19 职场文书
十一酒店活动方案
2014/02/20 职场文书
还款承诺书范文
2014/05/20 职场文书
法人授权委托书范本
2014/09/17 职场文书
运动会稿件100字
2014/09/24 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
总经理助理岗位职责
2015/01/31 职场文书
团委工作总结2015
2015/04/02 职场文书
2015年专项整治工作总结
2015/04/03 职场文书
中小企业员工手册范本
2015/05/14 职场文书
新闻通讯稿模板
2015/07/22 职场文书
CSS3常见动画的实现方式
2021/04/14 HTML / CSS