3.6 KiB
3.6 KiB
API Proxy Mock
基于 Node.js 的轻量级 HTTP 代理 + 本地 Mock:在 config.json 里配置要拦截的路径和本地文件,其余请求通过 HTTPS 转发到真实后端。
功能说明
- 代理转发:未命中 Mock 的请求会转发到
config.targetHost(HTTPS,targetPort可配,默认 443)。 - 本地 Mock:命中路由时直接读取
mock目录下的文件作为响应体。 - Mock 总开关:
mockEnabled为false时不拦截任何 Mock 路由,全部走代理。 - 热更新:
reloadOnChange为true时监听config.json变更并自动重载;也可通过管理接口手动重载。 - Mock 响应:带简单 CORS 头,以及
X-Mock-Source、X-Mock-Timestamp便于排查。
环境要求
- Node.js(建议 18+)
- 依赖见
package.json:typescript、ts-node、@types/node(仅开发/类型)
安装与启动
npm install
推荐使用 npm 脚本(使用项目内 tsconfig.json,避免 tsc .\某文件.ts 触发 TS5112):
npm run dev
# 或
npm start
等价于:
npx ts-node --project tsconfig.json ./index.api.ts
类型检查(不生成 JS):
npm run typecheck
启动成功后,控制台会输出本地监听地址、目标主机与配置文件路径等。
配置文件 config.json
与 index.api.ts 同目录。若首次运行不存在,程序会生成一份默认配置。
基础结构示例:
{
"routes": {
"/api/example": "mock/example.txt"
},
"config": {
"mockEnabled": true,
"cacheConfig": true,
"reloadOnChange": true,
"defaultContentType": "application/json",
"proxyPort": 8877,
"targetHost": "example.com",
"targetPort": 443
}
}
routes
| 说明 | |
|---|---|
| key | 请求路径,只匹配 pathname(不含域名;查询串不参与匹配),例如 "/api/user/info"。 |
| value | 相对项目根目录(与 index.api.ts 同级)的文件路径,例如 "mock/user.txt"。 |
| 注释 | 以 # 开头的 key 视为注释,不参与 Mock。例如 "#/api/old": "mock/x.txt" 会被忽略。 |
config
| 字段 | 说明 |
|---|---|
mockEnabled |
可选。为 false 时关闭 Mock,所有请求走代理;缺省为 true。 |
cacheConfig |
保留字段;当前实现中未参与逻辑,可忽略或与旧配置兼容。 |
reloadOnChange |
是否监视 config.json 文件变化并自动重新加载。 |
defaultContentType |
Mock 成功时的 Content-Type,常用 "application/json"。 |
proxyPort |
本机 HTTP 代理监听端口。 |
targetHost |
上游 HTTPS 主机名(不含协议与路径)。 |
targetPort |
可选。上游 HTTPS 端口,缺省为 443。非 443 时请在配置中显式写出。 |
管理接口
将 <proxyPort> 换为 config.proxyPort 中的值:
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
http://localhost:<proxyPort>/__config |
查看当前路由与配置 |
POST |
http://localhost:<proxyPort>/__reload-config |
手动重新加载 config.json |
TypeScript 与编译说明
- 项目根目录包含
tsconfig.json,请使用tsc -p .或npm run typecheck做整项目检查。 - 不要使用
tsc .\index.api.ts这类「命令行附带单个文件」的方式,否则会与tsconfig.json冲突并报 TS5112。
目录说明
index.api.ts:服务入口。config.json:路由与运行参数。mock/:Mock 响应文件(文本内容原样返回,按需自行写成 JSON 等)。