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


  • 2019-11-29 13:47:22

    百度地图做电子围栏总结

    在地图上画出围栏,设置围栏信息后保存,生成围栏列表。全选时,地图视野可看到全部的围栏区域,单独勾选会调整地图视野到当前勾选的围栏。围栏区域的中心点要显示围栏名称。

  • 2019-11-29 13:50:29

    图片连接处出现白线

    block导致,只要父元素设置font-size:0或者设置img display: block; 便可。但是我设置了没有用,这条线不是所有的机型都有,而且页面滚动之后又消失,我琢磨半天,各种尝试,发现把图片高度减少(增加)1px就解决了。因为我们的项目是用postcss-px-to-viewport,我每张图片都是设置高度的,应该是数值转换出现偏差。

  • 2019-11-29 13:54:07

    粗略计算多边形中心点(并不是很准确,但简单好用)

    也是再做栅栏系统,搜索如何获取多边形中心点的问题上,发现了这个,简单易于理解,但是并不是特变准确,但也不影响使用。 后来发现了新的算法,并且百度地图也提供相应的api。 具体内容我写在了前面的文章,大家可以找一下。

  • 2019-11-29 14:20:38

    vue,vuthis.$parent算法

    由于组件嵌套,其实vue parent的位置也改变了,我们可以通过下面的图片,来看一下,parent到底什么哪一层

  • 2019-11-29 14:23:24

    百度地图 多个标记点设置最佳视角

    通过下面的语法,我们可以为不规则图形,以及过大的图形进行地图适配,更好的展示我们画的图形,当然,如果展示所有的图形,我们可以暴力的把所有的点组合起来进行展示,点过多不知道会不会影响性能,不过我们也可以从后台精简点数,不过地球是圆的,不知道好不好做。

  • 2019-12-01 08:00:16

    PHP中的HTTP_HOST和SERVER_NAME有什么区别

    多域名指向同一个php服务器,用nginx做代理,获取SERVER_NAME都是第一个域名,这就尴尬了,至今不明白咋回事,最后用HTTP_HOST解决都,这个暂时倒是准确。

  • 2019-12-01 08:04:30

    laravel多路由配置,也可以做根据域名都动态路由

    在用laravel 框架开发大型应用的时候,由于 laravel 默认是只有一个路由文件,如果把项目所有模块的路由放在一个路由文件下,那么该路由文件就显得很臃肿,以至于后期难以维护,解决方案是根据不同模块配置不同路由文件。