详解用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 相关文章推荐
在网页中控制wmplayer播放器
Jul 01 Javascript
使Ext的Template可以解析二层的json数据的方法
Dec 22 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
Feb 10 Javascript
推荐9款炫酷的基于jquery的页面特效
Dec 07 Javascript
仅30行代码实现Javascript中的MVC
Feb 15 Javascript
js制作可以延时消失的菜单
Jan 13 Javascript
js Dom实现换肤效果
Oct 21 Javascript
js实现控制文件拖拽并获取拖拽内容功能
Feb 17 Javascript
Vue动态加载异步组件的方法
Nov 21 Javascript
如何自定义微信小程序tabbar上边框的颜色
Jul 09 Javascript
vue之debounce属性被移除及处理详解
Nov 13 Javascript
JavaScript浅层克隆与深度克隆示例详解
Sep 01 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生成年月日下载列表的方法
2015/04/24 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
jQuery EasyUI 的EasyLoader功能介绍
2010/09/12 Javascript
为JavaScript类型增加方法的实现代码(增加功能)
2011/12/29 Javascript
javascript工具库代码
2012/03/29 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
Jquery遍历节点的方法小集
2014/01/22 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
Jquery实现textarea根据文本内容自适应高度
2015/04/03 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
2015/04/27 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
js 判断登录界面的账号密码是否为空
2017/02/08 Javascript
AngularJS 异步解决实现方法
2017/06/12 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
js tab栏切换代码实例解析
2019/09/03 Javascript
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
python使用post提交数据到远程url的方法
2015/04/29 Python
python爬取淘宝商品销量信息
2018/11/16 Python
解决python super()调用多重继承函数的问题
2019/06/26 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
在Tensorflow中查看权重的实现
2020/01/24 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
HTML5离线缓存Manifest是什么
2016/03/09 HTML / CSS
求职简历的自我评价怎样写好
2013/10/07 职场文书
写好自荐信的几个要点
2013/12/26 职场文书
自考毕业自我鉴定
2014/03/18 职场文书
贷款担保申请书
2014/05/20 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
追悼会悼词大全
2015/06/23 职场文书
施工安全协议书
2016/03/22 职场文书