express 处理代理请求(express-http-proxy)

子车轶
2023-12-01

文章参考

  1. express-http-proxy使用方法

问题描述

开发中,不能直接访问接口服务器,因此需要使用代理

解决办法

express-http-proxy插件可以实现express代理

express-http-proxy快速入门案例

express 注册proxy

const app = express();
const http = require("http");
var proxy   = require('express-http-proxy')

// 配置代理 /
let proxyConfig = {
  URL: 'xx.xx.xx.xx',
  PORT: '3000'
}
// 访问 http://localhost:3000/hbapi 会转为  http://xx.xx.xx.xx:3000 请求
app.use('/hbapi', proxy('http://'+proxyConfig.URL+':'+proxyConfig.PORT, {
  // forwardPath: function(req, res) {
  //   debugger
  //   return require('url').parse(req.url).path;
  // }
}))

proxy()参数说明

  1. 第一个参数: 代理的服务器地址和端口,必填
  2. 第二个参数: 关于代理的配置参数,可以不填,使用默认配置

web页面ajax请求调用代理

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="/public/js/axios.min.js"></script>
</head>
<body>
  <button onclick="proxyAction()">发送proxy请求</button>
</body>
<script>
function proxyAction () {
  let paramObj = {}
  axios({
        method: 'GET',
        url: '/hbapi'+'/fetch/ajax',
        // 设置 header 参数
        data: paramObj
  })
  .then(function (resp) {
    console.log(resp.data)
  })
}
</script>
</html>

proxy配置参数说明

forwardPath

forwardPath选项用于在代理请求之前修改路径

var proxy = require('express-http-proxy'); 
var app = require('express')(); 

app.use('/proxy', proxy('www.google.com', {
  forwardPath: function(req, res) {
    return require('url').parse(req.url).path;
  }
}));

forwardPathAsync

forwardPathAsync选项用于在发送代理请求之前之前,使用Promise异步修改请求路径

app.use(proxy('httpbin.org', {
  forwardPathAsync: function() {
    return new Promise(function(resolve, reject) {
      // ... 
      // eventually 
      resolve( /* your resolved forwardPath as string */ )
    });
  }
}));

filter

filter选项主要用于筛选哪些请求可以被代理转发,例如,你只想转发get请求

app.use('/proxy', proxy('www.google.com', {
  filter: function(req, res) {
     return req.method == 'GET';
  },
  forwardPath: function(req, res) {
    return require('url').parse(req.url).path;
  }
}));

intercept

intercept选项用于在将响应返回给客户端之前,对响应做处理

app.use('/proxy', proxy('www.google.com', {
  intercept: function(rsp, data, req, res, callback) {
    // rsp - original response from the target 
    data = JSON.parse(data.toString('utf8'));
    callback(null, JSON.stringify(data));
  }
}));

decorateRequest

与intercept相反,decorateRequest选项用于在请求通过代理转发至目标主机之前,对请求进行处理

app.use('/proxy', proxy('www.google.com', {
  decorateRequest: function(proxyReq, originalReq) {
    // you can update headers 
    proxyReq.headers['Content-Type'] = 'text/html';
    // you can change the method 
    proxyReq.method = 'GET';
    // you can munge the bodyContent. 
    proxyReq.bodyContent = proxyReq.bodyContent.replace(/losing/, 'winning!');
    return proxyReq;
  }
}));

https 请求的协议类型与原始请求保持一致

通常代理请求的协议类型与原始请求保持一致,如果代理请求需要用https协议,可以用https选项强制实现

app.use('/proxy', proxy('www.google.com', {
  https: true
}));

preserveHostHdr 将HTTP头部复制到express代理服务器的HTTP头部

可以用preserveHostHdr选项将HTTP头部复制到express代理服务器的HTTP头部

app.use('/proxy', proxy('www.google.com', {
  preserveHostHdr: true
}));

reqAsBuffer 请求体(req.body)编码为Node Buffer

这是一个实验选项,用于在发送代理请求时,保证请求体(req.body)编码为Node Buffer

app.use('/proxy', proxy('www.google.com', {
  reqAsBuffer: true
}));

reqBodyEncoding 编码格式

request body默认编码格式为 utf-8。
当代理请求体为Buffer时,使用null来保存缓冲(例如,图像上传) ,接受 raw-body支持的任何值。
编码格式也可以通过intercept选项实现

app.use('/post', proxy('httpbin.org', {
  reqBodyEncoding: null
}));

timeout 增加超时

默认情况下。node在连接过程中,是没有timeout的。使用timeout选项增加超时,Timed-out requests 将会返回504和X-Timeout-Reason header。

app.use('/', proxy('httpbin.org', {
  timeout: 2000  // in milliseconds, two seconds 
}));
 类似资料: