详解用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 操作Javascript对象和数组的工具函数小结
Jan 22 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
Apr 05 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
Nov 04 Javascript
原生JS实现首页进度加载动画
Sep 14 Javascript
利用jquery实现瀑布流3种案例
Sep 18 Javascript
JS简单实现表格排序功能示例
Dec 20 Javascript
微信小程序 实战实例开发流程详细介绍
Jan 05 Javascript
jQuery手风琴的简单制作
May 12 jQuery
Angular4 ElementRef的应用
Feb 26 Javascript
快速解决vue-cli不能初始化webpack模板的问题
Mar 20 Javascript
angular4强制刷新视图的方法
Oct 09 Javascript
详解使用uni-app开发微信小程序之登录模块
May 09 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
Zend引擎的发展 [15]
2006/10/09 PHP
php格式输出文件var_export函数实例
2014/11/15 PHP
PHP简单实现HTTP和HTTPS跨域共享session解决办法
2015/05/27 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
js location.replace与location.reload的区别
2010/09/08 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
2015/12/10 Javascript
AngularJS基础 ng-mouseover 指令简单示例
2016/08/02 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
2016/08/03 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
jQuery实现底部浮动窗口效果
2016/09/07 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
AngularJS中一般函数参数传递用法分析
2016/11/22 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
如何重置vue打印变量的显示方式
2017/12/06 Javascript
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
vue实现多条件和模糊搜索功能
2019/05/28 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
Json实现传值到后台代码实例
2020/06/30 Javascript
vue中watch和computed的区别与使用方法
2020/08/23 Javascript
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
python根据出生日期返回年龄的方法
2015/03/26 Python
python中从for循环延申到推导式的具体使用
2019/11/29 Python
基于梯度爆炸的解决方法:clip gradient
2020/02/04 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
Python如何在bool函数中取值
2020/09/21 Python
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
字中字效果的实现【html5实例】
2016/05/03 HTML / CSS
数控专业个人求职信范例
2013/11/29 职场文书
医学生个人求职信范文
2014/02/07 职场文书
夫妻双方自愿离婚协议书怎么写
2014/12/01 职场文书
nginx配置虚拟主机的详细步骤
2021/07/21 Servers
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技