web服务代理用它,还不够吗?

前言:现大部分项目都是前后端分离,与后端调试时需要使用其提供的服务接口,但是同时开发几个功能对应不同的接口人,这时候就需要频繁的切换接口IP,大部分项目切换IP时需要关闭项目重新启动,非常麻烦。使用node写一个代理就尤为重要,还能自定义返回内容以方便调试。

依赖安装

库介绍:

代理:http-proxy-middleware,使用比较广泛,配置也比较简单

请求拦截:express、body-parser

js 复制代码
npm install express@4.18.2 http-proxy-middleware@2.0.6 body-parser@1.20.1 --save -dev

主要代码

js 复制代码
    const { createProxyMiddleware, responseInterceptor } = require('http-proxy-middleware');
    const express = require('express');
    const bodyParser = require('body-parser');
    const app = express();
    // 处理application/json内容格式的请求体
    app.use(bodyParser.json());
    // 处理application/x-www-form-urlencoded内容格式的请求体
    app.use(bodyParser.urlencoded({ extended: true }));
    // 选项
    const options = {
        xfwd: false,
        selfHandleResponse: true, //是否修改响应内容
        target: serverInfo.ip, // 目标服务器:代理ip+端口
        changeOrigin: true, // 默认false,是否需要改变原始主机头为目标URL
        ws: true, //代理socket
        secure: false, //是否需要证书认证
        router: function(req) { //动态代理
            //如:http://localhost:3000?proxyIp=http://1.1.1.1将被代理到http://1.1.1.1
            if(req.headers.referer) {
				const hostUrl = new URL(req.headers.referer);
				const proxyIp = hostUrl.searchParams.get('proxyIp');
				if(proxyIp) return proxyIp;
			}
        },
        onProxyReqWs(proxyReq, req, socket) {
            //代理socket
            proxyReq.on('upgrade', function(proxyRes, proxySocket, proxyHead) {
                proxySocket.on('data', (data) => {
                    socket.write(data);
                });
            });
        },
        onError(err, req, res, target) {
            //错误监听
            res?.writeHead?.(500, {
                'Content-Type': 'text/plain',
            });
            res?.end(err.message);
        },
        onProxyReq: async (proxyReq, req, res) => {
           //监听、重写请求头
           proxyReq.write(Buffer.from(JSON.stringify(req.body)));
            proxyReq.end();
        },
        onProxyRes: (proxyRes, req, res) => {
            //监听、重写返回结果
             return responseInterceptor(async (buffer, proxyRes, req, res) => {
                //响应内容
                let responseTxt = buffer.toString('utf8');
                return buffer;
             })(proxyRes, req, res)
        },
    }
    // 创建反向代理服务
    const proxy = createProxyMiddleware(options);
    // 定义 context 函数
    const server = app.use(proxy);
    // 启动服务
    app.listen(8080, function () {
        console.log([
            '代理服务已启动',
            `设备地址${serverInfo.ip}`,
            `请将proxy、cgi等所有与设备相关的地址修改为:http://localhost:${PORT}`
        ].join(","));
    });

各位还有其他方法吗,评论区留言。

相关推荐
数据掘金9 分钟前
小程序埋点方案的埋点文档怎么自动生成?
前端
deli0079 分钟前
cron 表达式为什么总跑错?10 个场景实测,下次执行时间一眼看懂
前端
代码猎人13 分钟前
前端怎么优化页面性能
前端
代码猎人15 分钟前
前端怎么配合后端完成数据对接
前端
lexiangqicheng21 分钟前
Docker的沙箱机制是怎样的?
前端·javascript
燕落南枝1 小时前
HTML 表格标签与 AI 合并单元格实战指南
前端·人工智能·html
zyseo81 小时前
谷歌SEO 内链地图脚本:Python 画出权重分发,揪出孤岛页
java·前端·python
ClickHouseDB2 小时前
ClickHouse .NET 驱动程序新特性:从 1.0 到 1.3 的演进之路
java·前端·windows
bitbrowser2 小时前
Gmail注册要求手机号如何解决?哪些情况可以不填手机号
前端·指纹浏览器·gmail