通过Node结合express和http-proxy-middleware实现完全的代理服务器
2018-02-08 23:34

http-prox-middleware实现代理

前面的文章我们讲过了通过node和express来实现请求的转发代理,但是那些代码只是简单实现,对于post请求,文件上传之类的请求并不起作用,因为参数传递不过去。

要想通过node实现完全的代理服务器,我们可以通过一个叫http-proxy-middleware的中间件来实现。

http-proxy-middleware实现代理的代码很简单:

var express = require('express');
var proxy = require('http-proxy-middleware');
 
var app = express();
 
app.use('/api', proxy({target: 'http://www.example.org', changeOrigin: true}));
app.listen(3000);

上面是从http-proxy-middleware在npm上的代码摘录,我们可以制定特定的路径进行请求的代理转发,其中的target参数是要转发到的服务器域名,第二个参数changeOrigin是改变请求中的origin字段,这样转发过去的请求就不会存在跨域问题,如果不设置changOrigin参数,并且转发到的服务器有跨域限制,那么就会出现跨域问题。

如果你想代理所有请求,http-proxy-middleware也是可以办到的,你只需把代理的路径改为"/":

app.use('/', proxy({target: 'http://www.example.org', changeOrigin: true}));

另外,及时你想代理的服务器之间是采用websocket通信的,很庆幸,http-proxy-middle也是可以帮你代理的,你只需添加一个"ws"参数设置即可:

proxy('/', {target:'http://echo.websocket.org', ws:true});

甚至这样:

proxy('http://echo.websocket.org', {ws:true});
或者
proxy('ws://echo.websocket.org');

都可以实现websocket的代理。

除此之外,http-proxy-middleware还提供了auth参数设置验证头信息,路由,cookie重写,路径重写等一系列参数。

我们可以实现一个完全的代理服务器来转发前端开发中的请求,进而就解决了一系列的跨域问题了。

http-proxy-middleware使用中的注意点

只有踩过的坑,才知道坑有多深,我刚开始使用http-proxy-middleware进行代理的时候,server服务器的代码中有本地的上传文件,post请求,而这时候就使用了一些列的中间件,

var bodyParser = require('body-parser')
var app = express()
 
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
 
// parse application/json
app.use(bodyParser.json())

这个东西用来处理请求中的参数转换问题,使用他之后可以通过request.body对象获取到前端传来的参数。

var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();
app.post('/upload', multipartMiddleware, function(req, resp) {
  console.log(req.body, req.files);
  // don't forget to delete all req.files when done
});

这个东西,可以处理”multipart/form-data“格式表单提交时携带的文件内容,用来实现文件上传。

而http-proxy-middleware不能在这两个中间件之后使用,如果在他们之后使用,那么http-prox-middleware所转发的数据就已经是被bodyParser或者connect-multiparty处理过后的参数,这个参数以及是js端的数据了,不一定会符合php或java后台所需参数。所导致的后果就是http-proxy-middleware不能有效的转发请求,返回正确的数据。


原创文章,转载请注明来自:妹纸前端-www.webfront-js.com.
阅读(1714)
辛苦了,打赏喝个咖啡
微信
支付宝
妹纸前端
妹纸前端工作室 | 文章不断更新中
京ICP备16005385号-1