问题描述:
开发过的项目老是打不开,因为离开公司后服务器用不了了。所以想着在公司开发的时候把数据都备份一下,供之后参考项目代码。

实现方法:
建一个Express服务,前端请求Express,Express代理目标服务器,通过请求api以json格式缓存到本地mocks文件夹内。第一次请求时缓存下来,第二次直接用缓存。

  1. 初始化项目
    创建一个新目录并初始化 package.json:

bash
mkdir mock-server
cd mock-server
npm init -y
安装必要的依赖:
bash
npm install express axios fs path url crypto

  1. 创建代理服务器代码
    创建 server.js 文件,内容如下:
const express = require('express');
const axios = require('axios');
const fs = require('fs');
const path = require('path');
const url = require('url');
const crypto = require('crypto');const app = express();
const MODE = 3; //1:根据路径生成缓存文件,2:根据路径和参数生成文件名,3:根据路径和参数和post 请求生成文件名
const PORT = 3000;
const TARGET_SERVER = 'http://192.168.0.184:6080'; // 替换为目标服务器地址const MOCK_DIR = path.join(__dirname, 'mocks');if (!fs.existsSync(MOCK_DIR)) {fs.mkdirSync(MOCK_DIR);
}app.use(express.json());// 工具函数:对对象进行排序序列化,用于生成稳定 hash
function sortedStringify(obj) {if (typeof obj !== 'object' || obj === null) return obj;// 如果是数组,则递归处理每一项if (Array.isArray(obj)) {return obj.map(item => sortedStringify(item));}const keys = Object.keys(obj).sort();const sorted = {};for (const k of keys) {sorted[k] = sortedStringify(obj[k]);}return JSON.stringify(sorted);
}// 工具函数:生成字符串的 hash,避免文件名过长
function getHash(str) {return crypto.createHash('md5').update(str).digest('hex');
}// 通用代理中间件
app.use(async (req, res) => {const parsedUrl = url.parse(req.url, true); // true 表示解析 query 参数const { pathname, query } = parsedUrl;// 构建缓存文件名:将 pathname 和 query 都作为标识const queryParamsStr = Object.entries(query).sort(([a], [b]) => a.localeCompare(b)) // 排序确保 key 顺序一致(避免缓存碎片).map(([k, v]) => `${k}=${v}`).join('&');let bodyHash = '';let fileNameBase = ``;let mockFilePath = ''if (MODE === 1) {mockFilePath = path.join(MOCK_DIR, `${pathname.replace(/\//g, '_')}.json`);} else if (MODE === 2) {fileNameBase = `${pathname.replace(/\//g, '_')}${queryParamsStr ? '_' + encodeURIComponent(queryParamsStr) : ''}`;mockFilePath = path.join(MOCK_DIR, `${fileNameBase}.json`);} else if (MODE === 3) {const queryStr = queryParamsStr ? '_' + encodeURIComponent(queryParamsStr) : '';if (req.method === 'POST' && req.body && Object.keys(req.body).length > 0) {const bodyStr = sortedStringify(req.body);bodyHash = '_' + getHash(bodyStr);// console.log(45, bodyHash, req.body)}fileNameBase = `${pathname.replace(/\//g, '_')}${queryStr}${bodyHash}`;mockFilePath = path.join(MOCK_DIR, `${fileNameBase}.json`);}// 检查本地是否存在缓存数据if (fs.existsSync(mockFilePath)) {const data = fs.readFileSync(mockFilePath, 'utf8');try {const jsonData = JSON.parse(data);console.log(`返回缓存数据: ${pathname}`);return res.json(jsonData);} catch (e) {console.error(`Failed to parse cached file: ${mockFilePath}`);}}// 否则转发请求到目标服务器try {const targetUrl = `${TARGET_SERVER}${parsedUrl.path}`;console.log('targetUrl:', targetUrl);const response = await axios({method: req.method,url: targetUrl,data: req.body,headers: req.headers,});// 将响应数据缓存到本地fs.writeFileSync(mockFilePath, JSON.stringify(response.data, null, 2), 'utf8');console.log(`缓存服务器数据: ${pathname}`);res.json(response.data);} catch (error) {console.error(`Proxy error for ${pathname}:`, error.message);res.status(error.response?.status || 500).json({error: error.message,});}
});app.listen(PORT, () => {console.log(`Mock server is running on http://localhost:${PORT}`);
});

注: 代码有3个模式,根据自己需要调。
1:根据路径生成缓存文件。如:get请求分页页面,pageNo传1和2只缓存1次。
2:根据路径和get的query参数生成缓存文件。如:get请求分页页面,pageNo传1和2缓存2次。
3:根据路径和参数和post 请求生成缓存文件(会缓存较多文件)。

  1. 使用方式
    启动服务:
    bash
    node server.js
    现在你本地运行了一个监听 http://localhost:3000 的代理服务器。

浏览器或前端请求示例:
将原本请求的目标 URL 改成:
http://localhost:3000/api/xxx
在这里插入图片描述

第一次请求会从真实服务器获取数据并缓存为文件(如:mocks/_api_xxx.json),后续请求直接使用本地缓存。

缓存文件:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88248.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88248.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88248.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows下利用DevEcoStudio的交叉编译工具链编译assimp库给OpenHarmony使用

文章目录 准备编译使用 准备 安装DevEco Studio,并且安装好对应OpenHarmony版本的SDK 比如我这里安装了API 11 的sdk 对应的文件夹 然后下载ASSIMP的源文件,我这里下载的是5.4.3版本 【assimp 5.4.3】 解压放在一个文件夹里面,并在源码文…

批量大数据并发处理中的内存安全与高效调度设计(以Qt为例)

背景 在批量处理大型文件(如高分辨率图片、视频片段、科学数据块)时,开发者通常希望利用多核CPU并行计算以提升处理效率。然而,如果每个任务对象的数据量很大,直接批量并发处理极易导致系统内存被迅速耗尽,出现程序假死、崩溃,甚至系统级“死机”。 Qt自带的线程池(Q…

微信小程序课程设计美食点餐订餐系统

文章目录 1. 项目概述2. 项目思维导图3. 系统架构特点4. 核心模块实现代码1. 登录注册2. 首页模块实现4. 分类模块实现5. 购物车模块实现6. 订单模块实现 5. 注意事项6. 项目效果截图7. 关于作者其它项目视频教程介绍 1. 项目概述 在移动互联网时代,餐饮行业数字化…

Linux中使用grep查看日志

Linux中使用grep查看日志 文章目录 Linux中使用grep查看日志1、使用 grep 查找字符或字符串示例常用选项例子 2、显示前后上下文选项说明示例命令 结果示例 3、显示出现的次数使用示例选项说明示例其他方法总结 4、其他命令1. 基本用法2. 常用选项3. 正则表达式支持4. 其他实用…

DataWhale-零基础络网爬虫技术(二er数据的解析与提取)

课程链接先给各位 ↓↓↓ (点击即可食用.QAQ Datawhale-学用 AI,从此开始 一、数据的解析与提取 数据提取的几种方式: re解析bs4解析xpath解析 1.1正则表达式(Reuglar Experssion) RE是一种用于字符串匹配的规则描述方式。它…

Gin框架与Apifox

第一部分:技术栈概述 1. Go语言简介 Go(又称Golang)是Google开发的一门静态类型、编译型编程语言,具有以下特点: 高性能:编译为机器码,执行效率接近C/C 简洁语法:没有复杂的OOP概…

Docker 容器技术入门与环境部署

一、Docker 技术概述与核心概念解析 (一)Docker 技术本质与定位 Docker 是当前主流的操作系统级容器虚拟化技术,其核心价值在于通过轻量化隔离机制解决开发、测试与生产环境的一致性问题。与传统虚拟机(如 VMware)相…

π0源码(openpi)剖析——从π0模型架构的实现:如何基于PaLI-Gemma和扩散策略去噪生成动作,到基于C/S架构下的模型训练与部署

前言 ChatGPT出来后的两年多,也是我疯狂写博的两年多(年初deepseek更引爆了下),比如从创业起步时的15年到后来22年之间 每年2-6篇的,干到了23年30篇、24年65篇、25年前两月18篇,成了我在大模型和具身的原始技术积累 如今一转眼已…

Vui:轻量级语音对话模型整合包,让交互更自然

Vui:轻量级语音对话模型,让交互更自然 🗣️✨ Vui 是 Fluxions-AI 团队推出的一款开源轻量级语音对话模型,其核心架构基于 LLaMA。这款模型经过了长达 4 万小时的真实对话数据训练,能够逼真地模拟人类对话中的语气词、…

【STL】深入理解 string 的底层思想

一、STL的定义 STL是C标准库的一部分它不仅是一个可复用的组件库还是一个包含数据结构和算法的软件框架。 二、STL的历史和版本 原始版本: Alexander Stepanov、Meng Lee在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运…

深入剖析Linux epoll模型:从LT/ET模式到EPOLLONESHOT的实战指南

一、epoll:高性能I/O复用的核心引擎 epoll是Linux内核2.6引入的高效I/O多路复用机制,专为解决C10K问题而生。相比select/poll,epoll在连接数激增时性能优势显著: // 创建epoll实例 int epollfd epoll_create1(0);// 事件注册 s…

网络安全之某cms的漏洞分析

漏洞描述 该漏洞源于Appcenter.php存在限制,但攻击者仍然可以通过绕过这些限制并以某种方式编写代码,使得经过身份验证的攻击者可以利用该漏洞执行任意命令 漏洞分析 绕过编辑模板限制,从而实现RCE 这里可以修改模板文件,但是不…

Nginx-前端跨域解决方案!

1 Nginx 核心 Nginx 是一个开源的高性能 HTTP 和反向代理服务器,以轻量级、高并发处理能力和低资源消耗著称。除作为 Web 服务器外,还可充当邮件代理服务器和通用的 TCP/UDP 代理服务器,广泛应用于现代 Web 架构中。 在 Windows 系统中使用…

RedisVL 入门构建高效的 AI 向量搜索应用

一、前置条件 在开始之前,请确保: 已在 Python 环境中安装 redisvl。运行 Redis Stack 或 Redis Cloud 实例。 二、定义索引架构(IndexSchema) 索引架构(IndexSchema)用于定义 Redis 的索引配置和字段信…

基于ssm移动学习平台微信小程序源码数据库文档

摘 要 由于APP软件在开发以及运营上面所需成本较高,而用户手机需要安装各种APP软件,因此占用用户过多的手机存储空间,导致用户手机运行缓慢,体验度比较差,进而导致用户会卸载非必要的APP,倒逼管理者必须改…

【Python】Tkinter模块(巨详细)

专栏文章索引:Python 有问题可私聊:QQ:3375119339 本文内容系本人根据阅读的《Python GUI设计tkinter从入门到实践》所得,以自己的方式进行总结和表达。未经授权,禁止在任何平台上以任何形式复制或发布原始书籍的内容。如有侵权,请联系我删除。 目录 一、Tkinter与GUI …

【C++特殊工具与技术】局部类

在 C 的类体系中,除了全局类、嵌套类(在类内部定义的类),还有一种特殊的存在 ——局部类(Local Class)。它像函数内部的 “封闭王国”,作用域严格限制在所属函数内,既拥有类的封装特…

《C#图解教程 第5版》深度推荐

《C#图解教程 第5版》深度推荐 在 C# 编程语言的浩瀚学习资源中,《C#图解教程 第5版》宛如一座灯塔,为开发者照亮前行之路。通过其详实的目录,我们能清晰窥见这本书在知识架构、学习引导上的匠心独运,无论是编程新手还是进阶开发者…

【Kubernetes】配置自定义的 kube-scheduler 调度规则

在最近一次 K8s 环境的维护中,发现多个 Pod 使用相同镜像时,调度到固定节点的问题导致集群节点资源分配不均的情况。 启用调度器的打分日志后发现这一现象是由 ImageLocality 打分策略所引起的(所有的节点中,只有一个节点有运行该…

跟着AI学习C# Day21

📅 Day 21:动态类型与动态语言运行时(Dynamic Types & DLR) ✅ 学习目标: 理解什么是 dynamic 类型;掌握 dynamic 与 object 的区别;理解 DLR(Dynamic Language Runtime&#…