注意事项:
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