express+http-proxy-middleware代理

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()
默识原创: http://www.cnblogs.com/hlere
 
分类:  express, javascript, nodejs
标签:  expressapp.use中间件app.unuse
好文要顶  关注我  收藏该文   
0
0
 
 
 
« 上一篇: mysql学习笔记(三)----函数
» 下一篇: openfire4.0.2开发环境搭建(windows)
posted @  2017-03-06 12:49  夜湫 阅读( 388) 评论( 0编辑  收藏

 
 
//这是一个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()

猜你喜欢

转载自www.cnblogs.com/xfpBlog/p/11311558.html
今日推荐