asai-nodejs-wsmock
v0.2.7
Published
asai for you
Readme
asai-nodejs-wsmock — WebSocket Mock 数据模拟插件
功能概述
asai-nodejs-wsmock 是一个Mock 数据模拟插件,用于在开发环境中模拟数据接口。它通过读取 dirmock.json 配置文件和对应的 JSON 数据文件,动态加载模拟数据(dirdb)和模拟函数(dirfn),为前后端分离开发提供数据模拟支持。
文件结构
asai-nodejs-wsmock/
├── README.md ← 本文档
└── AsaiWsMock.ts ← 入口文件:Mock 数据初始化入口文件 — AsaiWsMock.ts
function startMock($asai: any = {}, dirmockfn: any = {}) {
if ($asai.asaimock && $asai.hostconfig.path?.mock) {
$asai.asaimock.dirfn = dirmockfn($asai);
const base = $asai.serverRoot || process.cwd();
initMock(base);
mergeDirFn($asai); // 独立于 dirmock.json 成败
}
}
export default startMock;与 asaihost-nodejs 的关系
| 组件 | 职责 |
|------|------|
| asai-nodejs-wsmock(本插件) | 启动时加载 dirmock.json / dirdb JSON 数据,合并 dirfn handler |
| asaihost-nodejs → AsaiUtils.wsMock | WS 运行时 Mock 回包(wsWorkApi / wsWorkListen),消费 $asai.asaimock.db / .fn |
典型挂载(webserver/app.ts):
$asai.asaimock = { db: {}, fn: {} };
Object.assign($asai.asaimock, AsaiHostNodejs.AsaiUtils.wsMock($asai));
startMock($asai, dirmockfn);未匹配业务 WS 路由时,由 wsMock 根据 asaimock.db[hostdir][ty] 回包,避免前端 wssys.wsApi 一直等待。
核心逻辑分析
startMock($asai, dirmockfn)
初始化 Mock 数据系统:
- 前置条件检查:
$asai.asaimock对象必须存在,且$asai.hostconfig.path.mock已配置 - 挂载模拟函数:将
dirmockfn($asai)的处理函数列表注入到$asai.asaimock.dirfn - 加载 Mock 配置:调用
initMock(base)读取dirmock.json和数据文件 - 合并 dirfn:调用
mergeDirFn(),即使dirmock.json缺失或解析失败,宿主注入的 handler 仍会合并到$asai.asaimock.fn
路径基准:base = $asai.serverRoot || process.cwd()。优先 $asai.serverRoot(与 app.ts 一致),避免从仓库根启动时 cwd 错位导致 mock 永不加载。
initMock(mockpath) — Mock 数据加载
| 步骤 | 说明 |
|------|------|
| 1 | 读取 path.join(mockpath, hostconfig.path.mock, 'dirmock.json'),合并到 $asai.asaimock |
| 2 | 遍历 $asai.asaimock.dirdb,逐个读取 JSON 数据文件存入 $asai.asaimock.db |
(dirfn → fn 的合并在独立的 mergeDirFn() 中,见上文第 4 步。)
数据加载路径:path.join(base, hostconfig.path.mock, filename),其中 base 为 $asai.serverRoot || process.cwd()。
配置说明
// $asai.hostconfig
{
path: {
mock: '/mock/' // Mock 数据目录(相对于项目根目录)
},
asaimock: { ... } // 由外部系统初始化的 Mock 容器对象
}dirmock.json 配置格式
{
"dirdb": {
"users": "users.json", // 键名 → 数据文件映射
"config": "config.json"
},
"dirfn": {
"handler1": "..." // 模拟函数名列表
}
}使用示例
import startMock from './AsaiWsMock';
// 在系统初始化时调用
startMock($asai, ($asai) => {
return {
// 模拟处理函数
userHandler: (req, res) => {
const users = $asai.asaimock.db.users;
res.json(users);
}
};
});注意事项
- Mock 系统仅在开发环境启用(通过
$asai.asaimock是否存在控制) dirmock.json和数据文件使用同步fs读取,仅初始化时加载一次dirfn合并与dirmock.json加载解耦:JSON 失败时仍合并dirmockfn注入的 handler- 加载失败时会通过
$asai.$log('MOCK', ...)输出错误日志,不会中断进程
测试
单元测试目录:.youmengyu/test/unit/webserver/plugs/asai-nodejs-wsmock/
# 仓库根目录
node .youmengyu/test/asaitest.mjs --no-open
# 或单文件
npx tsx --test .youmengyu/test/unit/webserver/plugs/asai-nodejs-wsmock/<file>.test.mjs