详解用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 上传图片预览问题
Dec 06 Javascript
jquery实现勾选复选框触发事件给input赋值
Feb 01 Javascript
JavaScript使用slice函数获取数组部分元素的方法
Apr 06 Javascript
Bootstrap整体框架之JavaScript插件架构
Dec 15 Javascript
Javascript中的prototype与继承
Feb 06 Javascript
javascript闭包功能与用法实例分析
Apr 06 Javascript
React Native仿美团下拉菜单的实例代码
Aug 08 Javascript
JavaScript实现数值自动增加动画
Dec 28 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
Oct 10 jQuery
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
Sep 01 Javascript
vue-cli3单页构建大型项目方案
Apr 07 Javascript
如何用JavaScript检测当前浏览器是无头浏览器
Apr 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函数serialize()与unserialize()的使用方法
2014/08/19 PHP
ThinkPHP表单自动验证实例
2014/10/13 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
php常用正则函数实例小结
2016/12/29 PHP
PHP生成短网址的思路以及实现方法的详解
2019/03/25 PHP
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
JS格式化数字金额用逗号隔开保留两位小数
2013/10/18 Javascript
基于Javascript实现弹出页面效果
2016/01/01 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
2016/05/26 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
jQuery实现可兼容IE6的滚动监听功能
2017/09/20 jQuery
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
PyQt实现界面翻转切换效果
2018/04/20 Python
Python中字符串List按照长度排序
2019/07/01 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
娱乐地球:Entertainment Earth
2020/01/08 全球购物
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
暑期社会实践感言
2014/02/25 职场文书
学生请假条
2014/04/11 职场文书
《火烧云》教学反思
2014/04/12 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
个人先进事迹材料范文
2014/12/29 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
使用HTML+Css+transform实现3D导航栏的示例代码
2021/03/31 HTML / CSS
Nginx HTTP跳转至HTTPS
2022/05/15 Servers