NodeJs 中 http-proxy 使用

0

NodeJs 中 http-proxy 使用

http-proxy

介绍

官网-GitHub
node-http-proxy是一个 HTTP 可编程的,支持 websockets 的代理库。它适合于实现诸如反向代理和负载平衡器之类的组件。

使用场景

一般使用在前端静态页,后端是启动一个服务,挂载那个静态页。还有一个提供 api 的服务端。通过 NodeJs 这一层的粘合层来做一点的事,同时需要调用 api 的真实服务,就可以使用代理。

简而言之就是前端发起请求,NodeJS 层使用代理进行转发,后端服务层处理返回。

简单用法

以 ExpressJs 为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const http = require('http')
const express = require('express');
const httpProxy = require('http-proxy');

const app = express()
const proxy = httpProxy.createProxyServer({
target: 'http://localhost:5000' + '/api',
changeOrigin: true,
proxyTimeout: 30 * 60 * 1000
});
proxy.on('error', function (error, req, res) {
if (error.code !== 'ECONNRESET') {
console.error('proxy error', error);
}
})
app.use('/api', function (req, res, next) {
res.set('Content-Type', 'application/json; charset=UTF-8');
proxy.web(req, res);
});
const server = http.createServer(app)
server.listen(4000)
console.log('server listen:4000, view http://localhost:4000')
高阶

修改请求
在请求接口层之前,追加 headers 。
这里有个坑,就是我在 express 中间件中需要获取 body 的值就 需要使用 app.use(express.json())来解析,但是 http-proxy转发代理的时候,解析后的 body 转发不过去,只能在转换回去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function modifyProxyReq (proxyReq, req, res) {
proxyReq.setHeader('Content-Type', req.get('Content-Type') || 'application/json; charset=UTF-8');
if (!req.body || Object.keys(req.body).length === 0) {
return;
}
var contentType = proxyReq.getHeader('Content-Type');
var bodyData;

if (contentType.indexOf('application/json') > -1) {
bodyData = JSON.stringify(req.body);
}

if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {
bodyData = querystring.stringify(req.body);
}

if (bodyData) {
proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData));
proxyReq.write(bodyData);
}
}
proxy.on('proxyReq', function(proxyReq, req, res) {
// modify reqquest body to string
modifyProxyReq(proxyReq, req, res);
});

修改返回结果

1
2
3
4
5
6
proxy.on('proxyRes', function(proxyRes,req,res) {
express.json()(proxyRes, req, () => {
const body = proxyRes.body;
console.log('response body is -->', body);
});
})

总结

该组件简单使用来说非常方便,如果有定制需求的话,需要配合监听请求使用。其中遇到 http—>https 代理来说,会报证书错误之类的,配置选项追加 changeOrigin: true来解决问题。

-------------------本文结束 感谢您的阅读-------------------
坚持原创技术分享,您的支持将鼓励我继续创作!