详解用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 可拖拽的窗体控件实现代码
Mar 21 Javascript
几个比较实用的JavaScript 测试及效验工具
Apr 18 Javascript
基于JQuery 的消息提示框效果代码
Jul 31 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
May 14 Javascript
js实现目录定位正文示例
Nov 14 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
Dec 11 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
Dec 30 Javascript
jquery.qtip提示信息插件用法简单实例
Jun 17 Javascript
JQuery为元素添加样式的实现方法
Jul 20 Javascript
javascript中json基础知识详解
Jan 19 Javascript
Bootstrap DateTime Picker日历控件简单应用
Mar 25 Javascript
微信小程序封装的HTTP请求示例【附升级版】
May 11 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模块memcache和memcached区别分析
2011/06/14 PHP
php小技巧之过滤ascii控制字符
2014/05/14 PHP
分享一个Laravel好用的Cache宏
2015/03/02 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
PHP CURL post数据报错 failed creating formpost data
2016/10/16 PHP
Laravel学习教程之本地化模块
2017/08/18 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
JS的反射问题
2010/04/07 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
2015/02/13 Javascript
Javascript的表单验证长度
2016/03/16 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
Vue2实现组件props双向绑定
2016/12/02 Javascript
angular和BootStrap3实现购物车功能
2017/01/25 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
jQuery插件echarts实现的多柱子柱状图效果示例【附demo源码下载】
2017/03/04 Javascript
Vue.js实战之Vuex的入门教程
2017/04/01 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
2017/06/08 Javascript
Vue中之nextTick函数源码分析详解
2017/10/17 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
nodejs对项目下所有空文件夹创建gitkeep的方法
2019/08/02 NodeJs
vue实现计步器功能
2019/11/01 Javascript
[08:47]DOTA2每周TOP10 精彩击杀集锦vol.6
2014/06/25 DOTA
Python深入学习之上下文管理器
2014/08/31 Python
Python遍历某目录下的所有文件夹与文件路径
2018/03/15 Python
python利用smtplib实现QQ邮箱发送邮件
2020/05/20 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
Pycharm最常用的快捷键及使用技巧
2020/03/05 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
师德师风的心得体会
2014/09/02 职场文书
大学入学感言
2015/08/01 职场文书
MySQL官方导出工具mysqlpump的使用
2021/05/21 MySQL
Mysql 用户权限管理实现
2021/05/25 MySQL
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸