express+http-proxy-middleware代理

在项目中用到Express做服务器,使用了http-proxy-middleware来代理API请求。

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编辑  收藏

 

 
 

转载于:https://www.cnblogs.com/xfpBlog/p/11311558.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下步骤来实现在前端开发时同时使用mock接口和服务器接口: 1. 安装http-proxy-middlewarejson-server,分别用于代理服务器接口和mock接口。 ``` npm install http-proxy-middleware json-server --save-dev ``` 2. 在package.json中添加scripts,用于启动mock服务和代理服务器接口。 ```json "scripts": { "start": "node server.js", "mock": "json-server --watch db.json", "dev": "concurrently \"npm run mock\" \"npm start\"" } ``` 3. 创建一个server.js文件,用于代理服务器接口。 ```javascript const express = require('express'); const { createProxyMiddleware } = require('http-proxy-middleware'); const app = express(); app.use('/api', createProxyMiddleware({ target: 'http://localhost:3000', // 服务器接口地址 changeOrigin: true, })); app.listen(4000, () => { console.log('Proxy server listening on port 4000'); }); ``` 4. 创建一个db.json文件,用于存储mock数据。 ```json { "users": [ { "id": 1, "name": "Alice" }, { "id": 2, "name": "Bob" } ] } ``` 5. 在前端代码中使用http-proxy-middleware代理服务器接口和mock接口。 ```javascript import { createProxyMiddleware } from 'http-proxy-middleware'; const apiProxy = createProxyMiddleware('/api', { target: 'http://localhost:4000' }); const mockProxy = createProxyMiddleware('/api', { target: 'http://localhost:3000' }); // 在开发环境中使用mock接口,生产环境中使用服务器接口 const useMock = process.env.NODE_ENV === 'development'; const proxy = useMock ? mockProxy : apiProxy; const app = express(); app.use(proxy); // 使用代理 app.listen(3001, () => { console.log('App listening on port 3001'); }); ``` 通过以上步骤,就可以在前端开发时同时使用mock接口和服务器接口了。在开发环境中,可以使用mock接口进行快速开发和测试,而在生产环境中,则使用真实的服务器接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值