在计算机网络中,代理是一种中间服务,能够代理用户与网络资源之间的通信。代理服务器可以缓存网页内容、过滤网络流量或隐藏用户的真实IP地址等功能。
在日常开发中,我们接触最多的是客户端发送ajax到服务端。但是服务端并不是 node ,而是java或者go。
例如我们用 vue 开发应用。我们的感知是从客户端直接发送 ajax 到服务端。但是在浏览器发送ajax 到服务端,服务端响应到浏览器会出现跨域。这个时候就需要配置代理,node 此时就可以充当这个角色。
实际在开发环境 vue 就是利用 express 创建了一个开发服务,充当代理角色。这个代理服务主要是利用 http-proxy-middleware
中间件,实现代理服务器。
node 实现代理服务器原理
- 浏览器发送 ajax 请求到 node 服务
- node 服务将和 java 或者 go 服务约定好的 api转发给java 或者 go服务端
- java 服务或者 node 服务响应个 node 代理服务
- node 服务在响应给浏览器
简单示例
const http = require('http');const proxyServer = http.createServer((request, response) => {// 创建代理请求的选项const options = {hostname: '目标服务器的主机名',port: 80, // 目标服务器的端口号path: request.url,method: request.method,headers: request.headers};// 发起代理请求const proxyRequest = http.request(options, (proxyResponse) => {// 将代理服务器收到的响应转发给客户端response.writeHead(proxyResponse.statusCode, proxyResponse.headers);// 将代理服务器的响应通过管道传输给客户端,实现响应的转发。proxyResponse.pipe(response);});// 将客户端发来的请求体转发给目标服务器request.pipe(proxyRequest);// 处理代理请求错误proxyRequest.on('error', (error) => {console.error('代理请求错误:', error);response.statusCode = 500;response.end();});
});// 启动代理服务器
const PORT = 3000;
proxyServer.listen(PORT, () => {console.log('代理服务器已启动,监听端口', PORT);
});