尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Node系列 · ORM:模拟数据

Node系列 · ORM:模拟数据 Node系列 · ORM模拟数据模拟数据mock data是开发效率的关键——前端不依赖后端接口就能跑通页面后端不依赖真实业务就能跑测试。本章讲清楚两套场景的 mock 工具和最佳实践。一、为什么要 mock场景没 mock 的痛点有 mock 的好处前端开发等后端接口写好才能开始后端 schema 定好就能并行开发后端测试测试用例依赖真实数据库单元测试用内存 SQLite毫秒级跑完演示 / Demo没有真实数据用 Faker 生成逼真样本边界条件难构造如 100 万条记录程序化生成指定规模数据二、前端开发期 mock2.1mockjs数据生成器最经典的前端 mock 库按模板自动生成假数据npminstallmockjsconst Mock require(mockjs); // 生成一条随机用户 Mock.mock({ id: id, name: cname, // 中文姓名 email: email, avatar: image(100x100), age: integer(18, 65), address: city(true), // 中国省份城市 createdAt: datetime, }); // { // id: 620000192302020987, // name: 张伟, // email: ab.com, // ... // } // 批量生成列表 const data Mock.mock({ list|100: [{ // 生成 100 条 id: id, name: cname, status|1: [active, inactive], // 从数组随机取 1 个 }], });mockjs的语法模板丰富占位符含义cname中文姓名name英文姓名email邮箱integer(min, max)整数float(min, max, dmin, dmax)浮点数date/datetime日期image(WxH)随机图片 URLurl/domain/ipURL / 域名 / IPcity/province/county地理pick(arr)从数组随机取 1 个guidUUID2.2json-server假 REST API30 秒起一个完整 REST APInpminstall-gjson-server{ users: [ { id: 1, name: Alice, email: alicex.com }, { id: 2, name: Bob, email: bobx.com } ], posts: [ { id: 1, userId: 1, title: Hello } ] }$ json-server--watchdb.json--port3000GET /users# 列表GET /users/1# 详情POST /users# 创建PUT /users/1# 全量更新PATCH /users/1# 部分更新DELETE /users/1# 删除GET /users/1/posts# 关联查询自动支持过滤、排序、分页、关联查询——前端像调真接口一样调。2.3MSWMock Service Worker现代方案拦截浏览器 fetch / axios 请求返回 mock 数据npminstallmsw --save-dev npx msw init public/--save// src/mocks/handlers.js import { http, HttpResponse } from msw; export const handlers [ http.get(/api/users, () { return HttpResponse.json([ { id: 1, name: Alice }, { id: 2, name: Bob }, ]); }), http.post(/api/users, async ({ request }) { const body await request.json(); return HttpResponse.json({ id: Date.now(), ...body }, { status: 201 }); }), ];import { setupWorker } from msw/browser; import { handlers } from ./handlers; export const worker setupWorker(...handlers);优点拦截网络层而非 axios 层业务代码完全无感知——切到真接口时改 baseURL 即可。三、后端测试期 mock3.1 Faker.js生成器后端测试和 seed 数据最常用的库npminstallfaker-js/fakerconst { faker } require(faker-js/faker); // 设置中文 locale faker.locale zh_CN; const user { id: faker.datatype.uuid(), name: faker.name.findName(), email: faker.internet.email(), phone: faker.phone.number(), avatar: faker.image.avatar(), createdAt: faker.date.recent(), }; // 批量 const users Array.from({ length: 100 }, () ({ id: faker.datatype.uuid(), name: faker.name.findName(), email: faker.internet.email(), }));3.2 Sequelize 种子数据seeduse strict; const { faker } require(faker-js/faker); module.exports { up: async (queryInterface) { const users Array.from({ length: 50 }, () ({ id: faker.datatype.uuid(), name: faker.name.findName(), email: faker.internet.email(), createdAt: new Date(), updatedAt: new Date(), })); await queryInterface.bulkInsert(users, users, {}); }, down: async (queryInterface) { await queryInterface.bulkDelete(users, null, {}); }, };npx sequelize-cli db:seed--seed20240815-seed-users3.3 测试时用 SQLite 内存数据库单元测试不要打真实 MySQL——用 SQLite 内存数据库毫秒级建表const { Sequelize } require(sequelize); const sequelize new Sequelize(sqlite::memory:, { logging: false }); // 每个测试前同步模型 beforeEach(async () { await sequelize.sync({ force: true }); }); // 每个测试后断开 afterAll(async () { await sequelize.close(); });::: tip测试和生产用同一 ORM不同数据库。Sequelize 模型在 MySQL 和 SQLite 上都能跑——业务代码不变只换 connection。这是 ORM 跨数据库能力的最大价值。:::四、选型决策树需要 mock 数据 ├── 前端独立开发不依赖后端 │ ├── 简单 GET 数据 → json-server │ ├── 复杂生成规则 → mockjs自写 fetch wrapper │ └── 完整 fetch 拦截 → MSW推荐现代方案 │ └── 后端测试 / seed 数据 ├── 单元测试 → SQLite 内存 Faker.js ├── 集成测试 → Docker MySQL Faker.js └── seed 初始化 → sequelize-cli seed Faker.js五、最佳实践场景推荐前端独立开发MSW最现代拦截 fetch 业务无感简单 mock 后端json-server30 秒起步复杂数据模板mockjs或faker-js/faker单元测试SQLite 内存 Faker.jsE2E 测试真实数据库docker-compose 起 MySQLSeed 数据sequelize-cli seed Faker.js敏感字段永远不mock 真实用户信息::: warningmock 数据 ≠ 真实数据。生产环境加载种子数据用于演示前记得不要用真实姓名 / 邮箱 / 手机号标识字段加[MOCK]前缀准备好快速清空脚本:::六、小结前端 mockmockjs模板生成/json-serverREST API/MSW拦截 fetch推荐后端 mockFaker.js 生成 SQLite 内存数据库跑测试测试期永远不依赖真实数据库——毫秒级 vs 数十秒差异mock 数据要避免使用真实个人信息合规风险ORM 跨数据库能力让测试用 SQLite / 生产用 MySQL无缝切换
返回列表