Easy Mock与MongoDB:数据持久化原理剖析
在前后端分离开发中,Mock数据服务需要稳定存储接口定义、响应模板等关键数据。Easy Mock通过MongoDB实现数据持久化,确保服务重启后配置不丢失。本文将从数据模型设计、存储流程、查询优化三个维度解析其实现原理。
数据持久化架构概览
Easy Mock采用Mongoose作为ODM(对象文档映射)工具,实现JavaScript对象与MongoDB文档的双向映射。核心数据流向如下:
MongoDB连接初始化代码位于models/index.js,通过Mongoose建立连接池:
mongoose.connect(config.get('db'), {
useMongoClient: true,
poolSize: 20
})
核心数据模型设计
系统定义了7个核心数据模型,通过引用关系实现数据关联:
| 模型名称 | 主要字段 | 索引策略 | 关联模型 |
|---|---|---|---|
| Mock | project, url, method, mode | {project:1, create_at:-1} | Project |
| Project | user, group, name, url | {user:1, members:1, create_at:-1} | User, Group |
| User | username, email, password | - | - |
以Mock模型为例,models/mock.js定义了接口文档结构:
const schema = new Schema({
project: { type: ObjectId, ref: 'Project' },
description: String,
mode: String, // 存储Mock响应模板
url: String, // 接口路径
method: String, // HTTP方法
create_at: { type: Date, default: Date.now }
})
schema.index({ project: 1, create_at: -1 })
数据写入流程解析
接口定义从编辑器到数据库的完整路径:
-
前端编辑:用户在编辑器页面通过Ace编辑器编写Mock模板,设置URL和HTTP方法:
<div ref="codeEditor"></div> <Form-item label="URL"> <i-input v-model="temp.url"><span slot="prepend">/</span></i-input> </Form-item> -
数据验证:提交前执行格式校验,确保JSON语法正确:
const value = (new Function(`return ${this.temp.mode}`))() -
控制器处理:controllers/mock.js的create方法处理请求:
await MockProxy.newAndSave({ project: projectId, description, method, url, mode // 存储Mock响应模板 }) -
数据持久化:proxy/mock.js通过Mongoose完成数据库写入:
static newAndSave(docs) { return Mock.insertMany(docs) }
查询优化与缓存策略
为提升接口响应速度,系统采用多级缓存机制:
-
Redis缓存:热门项目接口列表缓存30分钟,代码位于controllers/mock.js:
const redisKey = 'project:' + projectId apis = await redis.get(redisKey) if (!apis) { apis = await MockProxy.find({ project: projectId }) await redis.set(redisKey, JSON.stringify(apis), 'EX', 60 * 30) } -
索引优化:Project模型复合索引支持多条件查询:
schema.index({ user: 1, members: 1, create_at: -1 }) -
查询投影:通过字段过滤减少数据传输量:
mocks = mocks.map(o => _.pick(o, ft.mock))
可视化操作流程
编辑界面包含三个核心区域:
- Ace代码编辑器:支持语法高亮和自动补全
- 请求配置区:设置HTTP方法、URL和描述
- 操作按钮区:提供格式化、预览和保存功能
当用户点击保存时,系统执行三级校验:
- 语法校验:确保JSON格式正确
- 权限校验:验证用户是否有项目操作权限
- 唯一性校验:防止同路径同方法接口重复创建
总结与扩展建议
Easy Mock通过Mongoose实现了清晰的数据持久化架构,但在高并发场景下仍有优化空间:
- 索引优化:为频繁查询的
(project, method, url)组合添加唯一索引 - 缓存策略:增加MongoDB查询缓存,减少重复计算
- 数据分片:按时间或项目ID对Mock集合进行分片存储
核心代码路径:
- 数据模型定义:models/
- 数据访问层:proxy/
- 业务逻辑层:controllers/
通过本文解析,开发者可深入理解系统的数据流转机制,为定制化开发和性能优化提供理论基础。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




