前端項目脫離后端運行,備份后端API數據

問題描述:
開發過的項目老是打不開,因為離開公司后服務器用不了了。所以想著在公司開發的時候把數據都備份一下,供之后參考項目代碼。

實現方法:
建一個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&#…