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
}));