开发中,不能直接访问接口服务器,因此需要使用代理
express-http-proxy
插件可以实现express代理
const app = express();
const http = require("http");
var proxy = require('express-http-proxy')
// 配置代理 /
let proxyConfig = {
URL: 'xx.xx.xx.xx',
PORT: '3000'
}
// 访问 http://localhost:3000/hbapi 会转为 http://xx.xx.xx.xx:3000 请求
app.use('/hbapi', proxy('http://'+proxyConfig.URL+':'+proxyConfig.PORT, {
// forwardPath: function(req, res) {
// debugger
// return require('url').parse(req.url).path;
// }
}))
proxy()参数说明
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="/public/js/axios.min.js"></script>
</head>
<body>
<button onclick="proxyAction()">发送proxy请求</button>
</body>
<script>
function proxyAction () {
let paramObj = {}
axios({
method: 'GET',
url: '/hbapi'+'/fetch/ajax',
// 设置 header 参数
data: paramObj
})
.then(function (resp) {
console.log(resp.data)
})
}
</script>
</html>
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选项用于在发送代理请求之前之前,使用Promise异步修改请求路径
app.use(proxy('httpbin.org', {
forwardPathAsync: function() {
return new Promise(function(resolve, reject) {
// ...
// eventually
resolve( /* your resolved forwardPath as string */ )
});
}
}));
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选项用于在将响应返回给客户端之前,对响应做处理
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));
}
}));
与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选项强制实现
app.use('/proxy', proxy('www.google.com', {
https: true
}));
可以用preserveHostHdr选项将HTTP头部复制到express代理服务器的HTTP头部
app.use('/proxy', proxy('www.google.com', {
preserveHostHdr: true
}));
这是一个实验选项,用于在发送代理请求时,保证请求体(req.body)编码为Node Buffer
app.use('/proxy', proxy('www.google.com', {
reqAsBuffer: true
}));
request body默认编码格式为 utf-8。
当代理请求体为Buffer时,使用null来保存缓冲(例如,图像上传) ,接受 raw-body支持的任何值。
编码格式也可以通过intercept选项实现
app.use('/post', proxy('httpbin.org', {
reqBodyEncoding: null
}));
默认情况下。node在连接过程中,是没有timeout的。使用timeout选项增加超时,Timed-out requests 将会返回504和X-Timeout-Reason header。
app.use('/', proxy('httpbin.org', {
timeout: 2000 // in milliseconds, two seconds
}));