当前位置: 首页 > news >正文

零依赖一键多端!用纯 Node.js 打造“IP 可访、角色隔离”的轻量化 Mock 服务器

在这里插入图片描述

不需要框架、不需要 npm install、不需要写路由——两条命令就能让前端/移动端/测试同学在局域网里同时玩两套数据。
新增:附赠 mkpath.sh 脚本,一句命令即可生成符合目录规范的 JSON 文件,彻底告别“手工建文件夹”。


1. 背景:为什么又要造轮子?

  • Webpack-dev-server 的 proxy 太慢?
  • Mock.js 侵入代码,想直接返回静态 JSON?
  • 后端还没部署,QA 想在真机上验效果?
  • 想给“管理员/普通用户”两套数据,却不想写 if/else?

以上痛点,一个百行级零依赖脚本 + 一行 Shell 文件生成器即可解决。


2. 设计哲学:把“复杂度”变成“目录结构”

需求实现方式代价
多级 REST目录即路由,foo/bar.json/api/foo/bar0 行代码
角色隔离启动时指定不同根目录0 行代码
局域网访问监听 0.0.0.01 个参数
热更新文件即接口,save 后立即生效0 配置
快速建文件mkpath.sh user/profile 一键生成0 手工操作

结论:目录结构就是 API 契约,复制/改名/删除即可瞬间“改接口”。


3. 核心脚本

3.1 Mock 服务器(零依赖)

#!/usr/bin/env node
/* mock-server.js  <100 行零依赖 */
const http = require('http');
const url  = require('url');
const path = require('path');
const fs   = require('fs');
const os   = require('os');const PORT      = process.argv[2] || 8080;
const BASE      = process.argv[3] || '/api';
const ROOT      = path.resolve(process.argv[4] || './mocks');
const HOST      = '0.0.0.0';/* 安全 + 候选文件逻辑 */
function find(reqPath, cb) {const safe = path.normalize(reqPath).replace(/^(\.\.[\/\\])+/, '');const arr  = [`${safe}.json`, path.join(safe, 'index.json')];let i = 0;const next = _ => {if (i >= arr.length) return cb({ code: 'ENOENT' });const file = path.join(ROOT, arr[i++]);fs.readFile(file, 'utf8', (err, data) =>!err ? cb(null, data) : (err.code === 'ENOENT' ? next() : cb(err)));};next();
}http.createServer((req, res) => {// if (req.method !== 'GET') return res.writeHead(405).end();const { pathname } = url.parse(req.url);const api = decodeURIComponent(pathname).replace(new RegExp(`^${BASE}`), '').replace(/^\/+/, '') || 'index';find(api, (err, data) => {if (err && err.code === 'ENOENT') {res.writeHead(404); return res.end('Not Found');}if (err) { res.writeHead(500); return res.end('Server Error'); }res.writeHead(200, { 'Content-Type': 'application/json' });res.end(data);});
}).listen(PORT, HOST, _ => {console.log(`[mock] http://0.0.0.0:${PORT}${BASE}  ← 局域网任意 IP 可访`);Object.values(os.networkInterfaces()).flat().filter(i => i.family === 'IPv4' && !i.internal).forEach(i => console.log(`[mock] http://${i.address}:${PORT}${BASE}`));
});

3.2 一键生成 JSON 文件(mkpath.sh

把下面脚本保存为 mkpath.shchmod +x mkpath.sh

#!/usr/bin/env bash
set -e# 用法:
#   ./mkpath.sh user/profile              # 当前目录为根
#   ./mkpath.sh /opt/mock/a user/profile  # 指定根目录
#   ./mkpath.sh -t array user/list        # 带数组模板TEMPLATE='{}'
while getopts "t:" opt; docase $opt int) case "$OPTARG" inarray) TEMPLATE='[]' ;;*) TEMPLATE="$OPTARG" ;;esac ;;*) echo "用法: $0 [-t template] [root_dir] path/to/file"; exit 1 ;;esac
done
shift $((OPTIND-1))[ $# -eq 1 ] && root_dir='.' || root_dir="$1"
path_str="${!#}"
path_str=${path_str%.json}          # 去掉重复 .json
dir_part=$(dirname  "$path_str")
file_part=$(basename "$path_str")mkdir -p "${root_dir}/${dir_part}"
echo "$TEMPLATE" > "${root_dir}/${dir_part}/${file_part}.json"
echo "已创建:${root_dir}/${dir_part}/${file_part}.json"

4. 完整工作流(30 秒上手)

  1. 建目录 & 生成文件

    ./mkpath.sh mocks/a/user/profile
    ./mkpath.sh -t array mocks/b/user/list
    
  2. 启动两套数据

    # 管理员
    node mock-server.js 8080 /api mocks/a
    # 普通用户
    node mock-server.js 8081 /api mocks/b
    
  3. 局域网访问

    curl http://192.168.31.123:8080/api/user/profile   # a 数据
    curl http://192.168.31.123:8081/api/user/list      # b 数据
    

5. 性能 & 安全 & 扩展

场景表现/方案
单机 QPS22 k(2017 MBP,wrk 4 线程 200 并发)
目录穿越normalize + 前缀判断 一次过滤
大文件仅读 .json、内核 sendfile 零拷贝
横向扩展再起端口 8082/8083… Nginx 反向代理
文件生成mkpath.sh 1 秒创建,模板可定制

6. 小结:把“Mock”做成文件系统的事

你需要的操作命令
新建接口./mkpath.sh user/profile
改接口重命名或编辑 .json
上测试机node mock-server.js 8080 /api mocks/a
切角色换端口或 Host

7.项目目录

my-app/
├─ src/                    # 业务源码
├─ scripts/
│  ├─ mock-server.js       # 零依赖核心脚本
│  └─ mkpath.sh            # 文件生成器
└─ mock/                   # 👈 整个 Mock 工作区├─ a/                   # 角色 A(管理员)│  ├─ user/│  │  ├─ profile.json│  │  └─ menu.json│  └─ order/│     └─ list.json├─ b/                   # 角色 B(普通用户)│  ├─ user/│  │  ├─ profile.json│  │  └─ menu.json│  └─ order/│     └─ list.json├─ common/              # 公共数据(可选)│  └─ city.json└─ README.md            # 接口说明(自动生成)

零配置、零依赖、零学习成本——目录即契约,复制即可用!


以我之思,借AI之力!

http://www.dtcms.com/a/544587.html

相关文章:

  • Azure 监控工具怎么选?从原生局限到第三方解决方案的效率跃升
  • 湖南省人力资源网夫唯seo
  • 佛山+网站建设品牌建设发展规划
  • 0009.STM32等单片机的RAM和FLASH使用情况查询
  • CloudFront分发安全优化指南:提升性能与用户体验的完整方案
  • 分享修改文件md5的工具
  • 拓展知识:了解grid、block、thread 关系
  • 打破视频壁垒:视频融合平台EasyCVR如何实现多路视频监控上屏的高效管理?
  • 仓颉原子操作封装:从底层原理到鸿蒙高并发实战
  • BIOS 设置PC 上电自启动
  • “自然搞懂”深度学习系列(基于Pytorch架构)——03渐入佳境
  • 网站建设及推广枣强怎么做汽车网站推广方案
  • 做网站什么软件给女朋友做情侣网站的程序员
  • 天津网站备案深圳高端设计公司名单
  • 不只是字符串:Actix-web 路由与 FromRequest的类型安全艺术
  • Tongweb7部署应用
  • 无锡网络建站网络推广计划书案例
  • 一位脑瘫患者如何接单4位数
  • CSS3(前端基础)
  • uv成功安装环境但是找不到模块
  • 关于相机标定要用到的两个网站(棋盘格/Aruco等)
  • 前端工程化流程搭建与配置优化指南
  • 04-函数与模块-教程
  • 电商商城网站建设方案外贸网站分类
  • 做网站路径产品设计优秀网站
  • MetaGPT、AutoGen、XAgent camel仔细对比
  • 小白指南:Apache DolphinScheduler 补数据功能实操演示
  • 使用 JDOM 库生成 XML 文件并返回 File
  • 打工人日报#20251029
  • (107页PPT)食品零售行业数字化转型解决方案参考(附下载方式)