http-proxy-middleware
http-proxy-middleware 官方文档: https://www.npmjs.com/package/http-proxy-middleware
中文文档:https://www.cnblogs.com/zhaoweikai/p/9969282.html
http-proxy-middleware用于将请求转发给其他服务器。
eg:
var express = require('express');
var proxy = require('http-proxy-middleware');
var app = express();
app.use('/api', proxy({target: 'http://10.119.168.87:4000', changeOrigin: true}));
app.listen(3000);
说明:我们利用express在3000端口启动了一个小型的服务器,利用了app.use('/api', proxy({target: 'http://10.119.168.87:4000/', changeOrigin: true}))
这句话,使发到3000端口的/api请求转发到了4000端口。即请求http://localhost:3000/api
相当于请求http://10.119.168.87:4000/api
。
中间件:
app所挂载的"中间件"以及"路由"都在app._router.stack这个数组变量里面,每个"中间件",或者"路由"都是一个对象,他们以数组元素的形式存在app._router里面。
"中间件",或者"路由"的对象结构
//这是一个express.static();中间件在app._router.stack里面存储的数据结构 //pathToRegexp=require("path-to-regexp"); { handle: [Function: serveStatic] //中间件回调函数,比如: app.use(express.static("/public")),那么这里的handle=express.static("/public") name: 'serveStatic', //中间件的函数名,或者路由的函数名,假设中间件为 fn,那么name=fn.name params: undefined, path: undefined, keys: [], regexp: /^\/theme\/?(?=\/|$)/i, //匹配的路径,比如: app.use("/static",express.static("/public"));这里的regexp=pathToRegexp("/static"); route: undefined }
1. 销毁中间件,找到对应的中间件对象,删除元素, 2. 替换中间件,找到对应的中间件对象,重写handle,regexp属性 3. 动态添加,老办法,使用app.use()
项目中:
将json数据全部代理出去:json格式
{ name:'itc', ip:'10.33.69.76', port:'8080' }
例如,访问本地地址:http://127.0.0.1/itc 会代理到 http://10.33.69.76:8080/itc上
因为有用到增删改查的功能,所以动态修改json数据,都要重新绑定代理
//proxyClear 清空中间件,防止重复添加 function proxyClear(){ let stack = app._router.stack; for(let i=stack.lenght-1;i>=0;i--){ let item = stack[i]; if(item.name ==="middleware"){ //添加的中间件的name为“middleware” stack.splice(i,1) } } }
添加代理
//proxyTable 数据代理 function proxyTable(data){ //清空之前的中间件 proxyClear(); for(index in data){ let item = data[index]; let name = '/'+item.name; let ip = 'http://'+item.ip+':'+item.port; app.use(name,proxy({ target:ip, changeOrigin:true })) } }
app.use('/api', proxy(options)),相当于本地服务器监听到客户端请求的‘/api’接口时,执行的回到是上边的middleware中间件函数,从上边可以看出,该函数中将请求转发到代理服务器。
最后代理不成功:访问代理地址404
原因:因为涉及的功能比较多,所以单独写了一个文件,在这个子文件中有单独使用app,最后将app export出去,并在index.js文件中import进来,并将子文件使用app.use。
改:在子文件中添加监听端口,监听子文件的中间件,在子文件中定义的中间件通过子文件中定义的端口(3000)来访问,在子文件中定义的接口‘get’通过父文件中监听的端口(8080)来访问。
index.js
var express = require("express"); var app = express(); var example = require('../router/example');//子文件 app.use('/example',example)
app.listen(8080)
example.js
var express = require("express"); var app = express();
//proxyClear 清空中间件,防止重复添加 function proxyClear(){ let stack = app._router.stack; for(let i=stack.lenght-1;i>=0;i--){ let item = stack[i]; if(item.name ==="middleware"){ //添加的中间件的name为“middleware” stack.splice(i,1) } } }
//proxyTable 数据代理 function proxyTable(data){ //清空之前的中间件 proxyClear(); for(index in data){ let item = data[index]; let name = '/'+item.name; let ip = 'http://'+item.ip+':'+item.port; app.use(name,proxy({ target:ip, changeOrigin:true })) } }
app.get('/get',function(req,res){
proxyTable(data);
//设置响应的http状态,并向浏览器发送数据
res.status(200).send(data);
})
//子文件app中需要有个端口 用来访问中间件
app.listen(3000)
//这是一个express.static();中间件在app._router.stack里面存储的数据结构
//pathToRegexp=require("path-to-regexp");
{
handle: [Function: serveStatic]
//中间件回调函数,比如: app.use(express.static("/public")),那么这里的handle=express.static("/public")
name: 'serveStatic',
//中间件的函数名,或者路由的函数名,假设中间件为 fn,那么name=fn.name
params: undefined,
path: undefined,
keys: [],
regexp: /^\/theme\/?(?=\/|$)/i,
//匹配的路径,比如: app.use("/static",express.static("/public"));这里的regexp=pathToRegexp("/static");
route: undefined
}
知道了中间件数据的存储结构后,我们就可以很方便的销毁中间或者替换中间件,或者自己实现app.unuse()函数了
具体操作
1. 销毁中间件,找到对应的中间件对象,删除元素,
2. 替换中间件,找到对应的中间件对象,重写handle,regexp属性
3. 动态添加,老办法,使用app.use()
//这是一个express.static();中间件在app._router.stack里面存储的数据结构
//pathToRegexp=require("path-to-regexp");
{
handle: [Function: serveStatic]
//中间件回调函数,比如: app.use(express.static("/public")),那么这里的handle=express.static("/public")
name: 'serveStatic',
//中间件的函数名,或者路由的函数名,假设中间件为 fn,那么name=fn.name
params: undefined,
path: undefined,
keys: [],
regexp: /^\/theme\/?(?=\/|$)/i,
//匹配的路径,比如: app.use("/static",express.static("/public"));这里的regexp=pathToRegexp("/static");
route: undefined
}
知道了中间件数据的存储结构后,我们就可以很方便的销毁中间或者替换中间件,或者自己实现app.unuse()函数了
具体操作
1. 销毁中间件,找到对应的中间件对象,删除元素,
2. 替换中间件,找到对应的中间件对象,重写handle,regexp属性
3. 动态添加,老办法,使用app.use()