前面的文章我们讲过了通过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进行代理的时候,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不能有效的转发请求,返回正确的数据。