express-http-proxy做代理转发解决跨域和中间层问题

2020-11-24 20:42:31

参考地址 express-http-proxy使用方法


注意事项:

app.use('/proxy', proxy(' 
比如你访问的事 www.xxx.com/proxy/api/getJson
其实是访问的  www.google.com/api/getJson

express-http-proxy是一个express代理中间件,其用法如下:

安装

$ npm install express-http-proxy --save

用法

proxy(host, options);

例如,将路由为'/proxy'的请求转发至‘www.google.com’:则可用下列语句实现

var proxy = require('express-http-proxy'); var app = require('express')(); app.use('/proxy', proxy('www.google.com'));

Options

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

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

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

reqAsBuffer

这是一个实验选项,用于在发送代理请求时,保证请求体(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 }));

翻译:https://www.npmjs.com/package/express-http-proxy


  • 2020-11-17 10:13:16

    Vue.observable()进行状态管理

    随着组件的细化,就会遇到多组件状态共享的情况, Vuex当然可以解决这类问题,不过就像 Vuex官方文档所说的,如果应用不够大,为避免代码繁琐冗余,最好不要使用它,今天我们介绍的是 vue.js 2.6 新增加的 Observable API ,通过使用这个 api 我们可以应对一些简单的跨组件数据状态共享的情况。

  • 2020-11-17 10:17:18

    MongoDB日志文件查看

    默认情况下,MongoDB在此路径/var/log/mongodb/mongodb.log创建日志文件,如果找不到该日志文件,请检查MongoDB配置文件。

  • 2020-11-17 11:57:16

    app抓包无数据

    我们经常在wifi设置中 设置代理到我们的pc http代理软件上,多数情况下,此时我们开启的app流量都可以在代理软件上看到,比如charles , fiddler等等。 但是细心的人会发现 某些大厂的app 某些请求 在这些 http代理软件上就是抓不到, 给人的感觉就是 流量没从代理软件走一样。

  • 2020-11-17 11:57:55

    app抓不到包,解决很简单

    1.手机安装virtualXpost 并激活xpost 框架,如有问题自行百度。 2.安装justTrustMe,然后再virtualXpost中添加此模块 3.安装手机抓包神器packet capture 4.在virtualXpost中运行app,并打开packet capture抓包就行

  • 2020-11-17 16:50:16

    JS常见加密混淆方式

    目录 前端js常见混淆加密保护方式 eval方法等字符串参数 emscripten WebAssembly js混淆实现 JSFuck AAEncode JJEncode 代码压缩 变量名混淆 字符串混淆 自我保护,比如卡死浏览器 控制流平坦化 僵尸代码注入 对象键名替换 禁用控制台输出 调试保护,比如无限Debug,定时Debug 域名锁定

  • 2020-11-17 17:08:28

    用js编写WebAssembly ,WebAssembly 现状与实战

    自从 JavaScript 诞生起到现在已经变成最流行的编程语言,这背后正是 Web 的发展所推动的。Web 应用变得更多更复杂,但这也渐渐暴露出了 JavaScript 的问题:

  • 2020-11-17 17:28:06

    AssemblyScript 开发WebAssembly 教程

    WebAssembly 以及通过 AssemblyScript 的扩展,不会使每个网站都神奇地变得更快,但是这并不重要。 WebAssembly 之所以令人兴奋,是因为它可以使更多的应用在 Web 变得中可行。

  • 2020-11-17 21:15:48

    如何保障 API 接口的安全性?前端如何加密

    一、1. HTTP 请求中的来源识别 二、2. 数据加密 三、3. 数据签名 四、4. 时间戳 五、5. AppID 六、6. 参数整体加密 七、7. 限流 八、8. 黑名单 九、1. 压缩 十、2. 混淆 undefined、3. 加密