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(","));
    });

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

相关推荐
刘发财29 分钟前
弃用html2pdf.js,这个html转pdf方案能力是它的几十倍
前端·javascript·github
牛奶3 小时前
2026年大模型怎么选?前端人实用对比
前端·人工智能·ai编程
牛奶3 小时前
前端人为什么要学AI?
前端·人工智能·ai编程
Kagol6 小时前
🎉OpenTiny NEXT-SDK 重磅发布:四步把你的前端应用变成智能应用!
前端·开源·agent
GIS之路7 小时前
ArcGIS Pro 中的 notebook 初识
前端
JavaGuide7 小时前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
ssshooter7 小时前
看完就懂 useSyncExternalStore
前端·javascript·react.js
格砸8 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
Live000009 小时前
在鸿蒙中使用 Repeat 渲染嵌套列表,修改内层列表的一个元素,页面不会更新
前端·javascript·react native
柳杉9 小时前
使用Ai从零开发智慧水利态势感知大屏(开源)
前端·javascript·数据可视化