用nodejs搭建代理服务器

本文通过实例展示了如何使用Express和http-proxy-middleware搭建代理服务器,以解决前端请求跨域的问题。首先,创建了一个静态服务器并设置接口服务器。接着,当遇到跨域限制时,通过配置代理服务器将请求转发到目标接口,实现路径重写和请求转发,从而成功访问到原本受限的资源。这种方法对于前端开发中处理API调用的跨域问题非常实用。
摘要由CSDN通过智能技术生成

代理服务器的原理

在这里插入图片描述

案例

  • 安装 expresshttp-proxy-middleware
  • app.js 文件 node app.js
    var express = require('express');
    var app = express();
    app.use(express.static('./public'));
    app.listen(3000);
    
  • 在 public 文件夹下建立 a.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <button onclick="Click()">点击发送请求</button>
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
        <script>
            function Click() {
                 axios('http://localhost:5000/b')
                     .then(function(res) {
                         console.log(res);
                     });
            }
        </script>
    </body>
    </html>
    </body>
    </html>
    
  • 搭建接口服务器,接口服务器端口号 5000
    node interface.js
    var express = require('express');
    var app = express();
    
    app.get("/", (req, res) => {
        res.send("123");
    });
    
    app.get("/api/a", (req, res) => {
        res.send("a");
    });
    
    app.get("/b", (req, res) => {
        console.log(req.headers);
        res.send("b");
    });
    
    app.listen(5000);
    
  • 访问http://localhost:3000/a.html
    在这里插入图片描述

搭建代理服务器解决跨域问题

  • 更改 app.js
    var express = require('express');
    var proxy = require('http-proxy-middleware');
    var app = express();
    app.use(express.static('./public'));
    
    app.use('/api', proxy.createProxyMiddleware({
        target: 'http://localhost:5000',
        changeOrigin: false,
        pathRewrite: {
            "^/api": ""
        }
    }));
    app.listen(3000);
    
  • 更改 a.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <button onclick="Click()">点击发送请求</button>
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
        <script>
            function Click() {
                // axios('http://localhost:5000/b')
                //     .then(function(res) {
                //         console.log(res);
                //     });
    
                axios('/api/b')
                    .then(function(res) {
                        console.log(res);
                    });
            }
        </script>
    </body>
    </html>
    </body>
    </html>
    
  • 访问 http://localhost:3000/a.html
    在这里插入图片描述

原理解释

  • 将 a.html 请求地址改为 /api/b,那么发送请求的时候会自动补上主机和端口号http://localhost:3000
    在这里插入图片描述
    在这里插入图片描述
  • 所以请求发送到了3000端口
  • 参数含义
    target: 转发到的目标地址
    changeOrigin: 是否更改host。默认为false,不重写
    true
    在这里插入图片描述
    false
    在这里插入图片描述
    pathRewrite:路径重写(在这里是去掉’api’)
    在这里插入图片描述
  • 最终请求被转发到了 http://localhost:5000/b
    app.get("/b", (req, res) => {
        console.log(req.headers);
        res.send("b");
    });
    
  • 整个过程就像这样
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值