api-proxy-mock/README.md
2026-06-04 12:29:26 +08:00

148 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## API Proxy Mock
基于 Node.js 的轻量级 **HTTP 代理 + 本地 Mock**:所有配置(路由映射、服务器参数、接口列表)统一存储在 SQLite,mock 内容保存在 `mock/` 目录文件中,其余请求按配置(HTTP/HTTPS)转发到真实后端。通过 `/__admin` 管理面板进行可视化管理。
### 功能说明
- **代理转发**:未命中 Mock 的请求会转发到 `config.targetHost`(由 `targetHttps` 决定 HTTP/HTTPS,`targetPort` 可配)。
- **本地 Mock**:命中路由时直接读取 `mock/` 目录下的文件作为响应体。
- **SQLite 存储**:路由列表、接口列表、服务器配置全部存储在 `data/mock-mappings.sqlite3`。
- **Mock 总开关**:`mockEnabled` 为 `false` 时**不拦截**任何 Mock 路由,全部走代理。
- **Mock 响应**:带简单 CORS 头,以及 `X-Mock-Source`、`X-Mock-Timestamp` 便于排查。
- **管理面板**:访问 `/__admin` 进入 Element UI 可视化管理界面,支持以下功能:
- **路由配置**:增删改查路由映射,启用/禁用单条路由,已启用路由自动置顶排序。
- **Mock 数据配置**:新增/编辑/删除 Mock 文件,`mock/` 目录固定,只需输入文件名和后缀。
- **接口管理**:增删改查预置接口列表,支持 JSON 数组批量导入。
- **基础配置**:Mock 开关、默认 Content-Type(下拉选择)、代理端口(修改需重启)、目标主机/端口/HTTPS。
### 环境要求
- Node.js(建议 18+)
- 依赖见 `package.json`:`typescript`、`ts-node`、`@types/node`(仅开发/类型)、`sqlite3`
### 安装与启动
```bash
npm install
```
推荐使用 npm 脚本:
```bash
npm run dev
# 或
npm start
```
等价于:
```bash
npx ts-node --project tsconfig.json ./index.api.ts
```
类型检查(不生成 JS):
```bash
npm run typecheck
```
启动成功后,控制台会输出本地监听地址、目标主机等。
### 数据存储
所有配置统一存储在 SQLite 数据库 `data/mock-mappings.sqlite3` 中:
| 表名 | 用途 |
| --- | --- |
| `route_mappings` | 路由 → mock 文件映射 + 状态码 + 启用状态 + 接口名称 |
| `api_list` | 预置接口清单(名称 + 路径) |
| `mock_files` | mock 文件路径 + 别名 |
| `server_config` | 服务器配置(端口、目标主机、Content-Type 等) |
首次启动时,如果 `mock_files` 表为空,会自动扫描 `mock/` 目录下的文件并导入数据库。
### 管理接口
将 `<proxyPort>` 换为实际监听端口:
| 方法 | 路径 | 说明 |
| --- | --- | --- |
| `GET` | `http://localhost:<proxyPort>/__config` | 查看当前路由与配置 |
| `POST` | `http://localhost:<proxyPort>/__config` | 保存配置(服务器配置 + 路由) |
| `POST` | `http://localhost:<proxyPort>/__reload-config` | 从数据库重新加载配置 |
| `POST` | `http://localhost:<proxyPort>/__routes` | 新增/编辑路由映射 |
| `DELETE` | `http://localhost:<proxyPort>/__routes` | 删除路由映射 |
| `GET` | `http://localhost:<proxyPort>/__api-list` | 获取预置接口列表 |
| `POST` | `http://localhost:<proxyPort>/__api-list` | 新增/编辑预置接口 |
| `DELETE` | `http://localhost:<proxyPort>/__api-list` | 删除预置接口 |
| `GET` | `http://localhost:<proxyPort>/__mock-files` | 获取 mock 文件列表 |
| `POST` | `http://localhost:<proxyPort>/__mock-files` | 创建/更新 mock 文件 |
| `DELETE` | `http://localhost:<proxyPort>/__mock-files` | 删除 mock 文件 |
| `GET` | `http://localhost:<proxyPort>/__admin` | 配置管理页面(Element UI) |
#### `POST /__routes` 请求示例
```json
{
"route": "/api/new/mock",
"filePath": "mock/new-api.json",
"apiName": "新接口",
"statusCode": 200,
"enabled": true,
"useExistingFile": true
}
```
#### `POST /__config` 请求示例
```json
{
"config": {
"proxyPort": 8879,
"targetHost": "192.168.3.9",
"targetPort": 8092,
"targetHttps": false,
"defaultContentType": "application/json",
"mockEnabled": true
}
}
```
#### 批量导入接口示例
通过管理面板的「批量导入」按钮,输入以下格式的 JSON 数组即可批量添加预置接口:
```json
[
{ "route": "/api/login", "name": "登录接口" },
{ "route": "/api/user/info", "name": "获取用户信息" }
]
```
### TypeScript 与编译说明
- 项目根目录包含 `tsconfig.json`,请使用 **`tsc -p .`** 或 **`npm run typecheck`** 做整项目检查。
- **不要**使用 `tsc .\index.api.ts` 这类「命令行附带单个文件」的方式,否则会与 `tsconfig.json` 冲突并报 **TS5112**。
### 目录结构
```
├── index.api.ts # 服务入口
├── admin.html # 管理面板(Vue 2 + Element UI 单文件)
├── src/
│ ├── types.ts # TypeScript 类型定义
│ ├── constants.ts # 路径常量(MOCK_DIR、DB_FILE 等)
│ ├── state.ts # 运行时内存状态
│ ├── db.ts # SQLite 数据库 CRUD
│ ├── config.ts # 配置加载/保存
│ ├── proxy.ts # HTTP 服务 + 代理转发 + Mock 响应
│ ├── admin-handlers.ts # 管理接口处理
│ ├── mock-files.ts # Mock 文件加载与管理
│ ├── route-matching.ts # 路由匹配逻辑
│ ├── api-list.ts # 预置接口列表管理
│ └── utils.ts # 工具函数
├── mock/ # Mock 响应文件(文本原样返回)
└── data/
└── mock-mappings.sqlite3 # SQLite 数据库
```