最近遇到公司的一些项目,是纯静态的不用编译的普通项目,由于前端会跨域,这些项目他们原来是使用Nginx做服务器,然后进行请求的代理转发。但是由于我之前没有怎么接触过Nginx,一些配置基本上都不是很懂,每次都要去搜一下配置方法。所以我自己就是用express框架去做一个服务器,然后进行请求的代理转发。

首先需要准备的是,express框架,然后就是http-proxy-middleware这个中间件,最后就是把你的静态项目放到express的public目录下(因为我是使用express-generator脚手架生成的,public是存放静态文件目录)

之前利用express框架使用http-proxy-middleware去转发请求,都是只是转发到同一个目标服务器,因为普通页面的请求也就一两三个,都跑到同一服务器了。现在一个页面有多个请求,请求到不同服务器。故需要对原来的转发配置代码进行一些简单的修改,以适应开发需求。

我们知道在vue脚手架生成的项目中,webpack-dev-server也是可以进行代理转发的,它也是利用http-proxy-middleware进行代理转发的,如果你有用过这个,那么上手http-proxy-middleware这个中间件也是比较容易的,因为一般就只用到那几个字段进行配置,而且配置方法基本一模一样。

在webpack的官网文档中,最简单的代理转发例子是这样子的

当时因为vue项目的接口都是跑到同一个服务器域名下,所以这里总是设置一个服务器转发规则,也没有去注意到多写几个就是多几条转发到不同服务器的规则。受到这个启发,我在想把以前http-proxy-middleware的转发配置给改改,变成类似vue脚手架这里的可配置多条规则的配置文件。我的思路很简单,就是写个配置文件,然后在express的主文件(app.js)里面循环遍历配置文件信息,然后就可以实现转发多个配置规则的转发服务器。有了这个思路那么就可以来写一个简单的配置文件了。

先贴上转发列表的代码,有用过应该可以理解,如下:

// proxy.config_list.js
var proxy_config = {test: [{from: '/example1',              // 请求target: 'localhost:3100',       // 目标服务器changeOrigin: true,             // 默认false,是否需要改变原始主机头为目标URL},{from: '/example2',target: 'localhost:3101',changeOrigin: true,},{from: '/example3',target: 'localhost:3102',changeOrigin: true,},{from: '/example4',target: 'localhost:3103',changeOrigin: true,}]
}// 这里只是增加了请求的console打印而已
let data = proxy_config.test
let output = []
for (let i = 0; i < data.length; i++) {let p = {from: data[i].from,target: data[i].target,changeOrigin: data[i].changeOrigin,onProxyReq: function (proxyReq, req, res) {console.log('来自:', getIp(req), '的转发请求:', req.method, req.url, req.hostname)}}p.pathRewrite = {}p.pathRewrite['^' + data[i].from] = '/'output.push(p)
}// 获取来自请求主机的ip
var getIp = function(req) {var ip = req.headers['x-real-ip'] ||req.headers['x-forwarded-for'] ||req.socket.remoteAddress || '';if(ip.split(',').length>0){ip = ip.split(',')[0];}return ip;
}module.exports = output

接下来是在app.js里面的循环遍历配置文件的操作,如下:

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');const proxy = require('http-proxy-middleware')
var app = express();// 引用代理转发配置
var myProxyConfig = require('./proxy.config_list.js')
// use proxy
for (let j = 0; j < myProxyConfig.length; j++) {let myProxy = proxy(myProxyConfig[j])app.use(myProxyConfig[j].from, myProxy)
}// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));app.use('/', indexRouter);
app.use('/users', usersRouter);// catch 404 and forward to error handler
app.use(function(req, res, next) {next(createError(404));
});// error handler
app.use(function(err, req, res, next) {// set locals, only providing error in developmentres.locals.message = err.message;res.locals.error = req.app.get('env') === 'development' ? err : {};// render the error pageres.status(err.status || 500);res.render('error');
});module.exports = app;

基本上上面的代码一看就能明白,了解了思路自己搞一遍也就懂了,也不是什么很难的问题。就是一些小技巧帮助自己在开发过程中解决一些简单的问题而已。若有更好的办法,可以告诉我一下,学习学习。

使用http-middle-ware中间件进行多个接口请求转发相关推荐

  1. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  2. 跟我一起学.NetCore之中间件(Middleware)简介和解析请求管道构建

    前言 中间件(Middleware)对于Asp.NetCore项目来说,不能说重要,而是不能缺少,因为Asp.NetCore的请求管道就是通过一系列的中间件组成的:在服务器接收到请求之后,请求会经过请 ...

  3. 8中间件,csrf跨站请求伪造,auth模块

    昨日内容回顾  多对多三种创建方式   1.全自动    完全依赖于ManyToMany让django orm自动创建第三张表    优势:不需要你创建第三张表  自动创建    不足:第三张表扩展性 ...

  4. 【中间件技术】第二部分 CORBA规范与中间件(4) 编写对象接口

    文章目录 4.1 概述 4.1.1 接口与实现的分离 4.1.2 接口定义语言 4.2 `OMG IDL` 的语法与语义 4.2.1 词法规则 4.2.2 模块的声明 4.2.3 类型的声明 1. 基 ...

  5. 重学 Java 设计模式:实战外观模式「基于SpringBoot开发门面模式中间件,统一控制接口白名单场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

  6. 随想录(中间件接口的定义方法)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 很多时候,我们把ucgui.lwip.uip.sqlite.lua这些第三方软件称之为中间件, ...

  7. Java面试题 详解 超全200题

    目录 一.类.对象.方法.变量 二.集合类 三.流 四.多线程 五.异常处理 六.JVM 七.HotSpot虚拟机中的7种垃圾收集器 八.Javaweb 一.类.对象.方法.变量 1.知识图谱 2.类 ...

  8. 跨域解决方案(史上最易懂)

    跨域总结 1.跨域思路 跨域解决方案一般分为两种:前端解决,后端解决 1.1 前端解决方案 通过前端解决的思想就是,通过设置中间件把跨域的请求转发一下,其实就是反向代理, 比如 http://1.2. ...

  9. Spring Cloud——Consul——架构体系

    我们知道,Eureka 2.X因遇到问题,已停止研发.Spring Cloud官方建议迁移到Consul或者Zookeeper等其他服务发现中间件. 下面是 Spring Cloud 支持的服务发现软 ...

最新文章

  1. randaugment
  2. C# 线程安全与 lock锁
  3. php提示行号,在php中使用trigger_错误时如何获得正确的行号?
  4. Mysql之WHERE子句
  5. java 格式化位数_java数字如何格式化?
  6. 一行代码揭开CPU执行原理
  7. CSM管理系统_复选框删除多条记录
  8. oracle instr函数详解
  9. UVA10375 POJ2613 ZOJ1863 Choose and divide【组合计算+迭代】
  10. SQOOP --hive-import 错误(Sqoop Hive exited with status 1)及解决
  11. ROS学习记录:基于Python的ROS话题消息编程
  12. 数组中的最长山脉java实现
  13. ffmpeg视频切片方案
  14. h61 nvme硬盘_免装系统!机械硬盘系统迁移至固态硬盘技巧
  15. uv纹理坐标设定与贴图规则
  16. 中国象棋java大作业doc_《java语言程序设计》课程设计-中国象棋对弈系统(源码).doc...
  17. 综合实验:LVS+LAMP+NFS+MySQL读写分离
  18. 程序员的进化 - 在拉勾1024程序员节上的演讲
  19. linux系统怎么取消下载,Linux系统怎么彻底删除文件
  20. 服务器黑屏只显示鼠标是什么意思,电脑黑屏只显示鼠标怎么办

热门文章

  1. 罗马音平假字复制_LISA-- 炎(罗马音+平假)
  2. 基于Java的农产品销售管理系统设计与实现
  3. JDK/Java 14 发布
  4. openssl 学习备忘
  5. Java编写ATM取款机,实现各项功能
  6. SQL 中的 NULL 原来是这么回事
  7. linux命名信号量,在进程之间使用POSIX信号量(命名信号量,Linux,C)
  8. matlab中怎么仿真出bumps信号,显示仿真过程中生成的信号
  9. ip、子网掩码、网关、默认网关
  10. css系列--六种实现元素水平居中方法