第六十九课:Node.js 使用 http-proxy
学习目标
- 理解代理服务器的概念及其作用。
- 掌握
http-proxy
模块的安装和基本配置。 - 学习如何使用
http-proxy
模块处理HTTP和WebSocket请求。 - 学习如何自定义代理行为及错误处理。
学习内容
1. 代理服务器和http-proxy
模块
代理服务器是客户端与服务器之间的中介,用于转发客户端的请求到其他服务器。Node.js中的http-proxy
模块是一个强大的库,用于快速创建代理服务器以处理HTTP和WebSocket请求。
2. 安装
npm install http-proxy --save
3. 创建基本代理服务器
// 引入需要的模块
const http = require('http');
const httpProxy = require('http-proxy');
// 创建一个代理服务器对象
const proxy = httpProxy.createProxyServer({});
// 捕获代理服务器的错误事件
proxy.on('error', (err, req, res) => {
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end('代理错误:' + err.message);
});
// 创建一个常规HTTP服务器
const server = http.createServer((req, res) => {
// 设置代理的目标选项
const targetOptions = {
target: 'http://localhost:9000', // 目标服务器地址
changeOrigin: true, // 为跨域请求修改origin
ws: true, // 代理WebSocket
pathRewrite: { '^/proxy': '' }, // URL重写:移除请求路径中的'/proxy'
headers: { // 自定义请求头
'Custom-Header': 'value'
}
};
// 使用代理服务器转发请求
proxy.web(req, res, targetOptions);
});
// 服务器监听在3000端口
server.listen(3000, () => {
console.log('代理服务器运行在 http://localhost:3000');
});
4. 参数解释
target
: 代理的目标服务器地址。changeOrigin
: 修改代理请求的origin头,伪装来源地址,常用于跨域请求。ws
: 如果需要支持WebSocket,设置为true。pathRewrite
: 重写URL路径,这在转发请求到目标服务器时去除不必要的路径部分时非常有用。headers
: 可以添加或重写请求头。
5. 代理WebSocket请求
// 在同一个HTTP服务器上代理WebSocket请求
server.on('upgrade', (req, socket, head) => {
proxy.ws(req, socket, head);
});
课后练习
- 在你的本地环境设置两个简单的HTTP服务器,端口分别为3000和9000。
- 使用
http-proxy
创建一个监听在3000端口上的代理服务器,将所有请求转发到9000端口上的服务器。 - 尝试使用
changeOrigin
和pathRewrite
配置选项。 - 添加错误处理机制,确保所有代理错误被捕获并向客户端提供友好的错误消息。
- 扩展代理服务器以支持WebSocket,验证WebSocket连接是否通过代理正确转发。
练习解析
请分别为端口3000和9000创建简单的HTTP服务器,然后配置代理服务器如上所述,并测试代理功能,确保HTTP请求和WebSocket连接都可以成功转发。对于错误处理,尝试关闭目标服务器以模拟代理错误,并观察错误处理机制是否能正确工作。