{"id":20716478,"url":"https://github.com/akira-cn/mocor","last_synced_at":"2025-07-30T14:33:25.109Z","repository":{"id":180286279,"uuid":"664885882","full_name":"akira-cn/mocor","owner":"akira-cn","description":"The most convenient API mocking tool.","archived":false,"fork":false,"pushed_at":"2023-07-25T02:29:12.000Z","size":4735,"stargazers_count":8,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-23T13:24:35.706Z","etag":null,"topics":["api-mock","data-mocking","debugging","mock","nodejs"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/akira-cn.png","metadata":{"files":{"readme":"README-CN.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-07-11T01:22:22.000Z","updated_at":"2023-07-17T07:04:09.000Z","dependencies_parsed_at":"2025-04-23T13:31:47.361Z","dependency_job_id":null,"html_url":"https://github.com/akira-cn/mocor","commit_stats":null,"previous_names":["akira-cn/mocor"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/akira-cn/mocor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akira-cn%2Fmocor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akira-cn%2Fmocor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akira-cn%2Fmocor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akira-cn%2Fmocor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/akira-cn","download_url":"https://codeload.github.com/akira-cn/mocor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akira-cn%2Fmocor/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267882830,"owners_count":24160214,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-30T02:00:09.044Z","response_time":70,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-mock","data-mocking","debugging","mock","nodejs"],"created_at":"2024-11-17T03:05:53.674Z","updated_at":"2025-07-30T14:33:25.088Z","avatar_url":"https://github.com/akira-cn.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Mocor\n\nMocor 是目前为止最方便的快速配置生成服务端API接口的 Node.js 库。\n\n- 非常易于使用\n- 自动生成API文档\n- 结合[AirCode](https://aircode.io/)使用效果更佳\n\n## 快速上手\n\n1. 本地结合[Koa](https://koajs.com/)使用：\n\n```js\nconst Koa = require('koa');\nconst {bodyParser} = require(\"@koa/bodyparser\");\n\nconst {Mock} = require('mocor');\n\nconst app = new Koa();\n\nconst mock = new Mock();\n\nmock.use({\n  hello: 'mocor',\n}, {\n  allowMethods: ['GET','POST']\n});\n\napp\n  .use(bodyParser())\n  .use(async (ctx) =\u003e {\n    const params = ctx.method === 'GET' ? ctx.query : ctx.request.body;\n    const result = await mock.execute(params, ctx);\n    if(ctx.response.headers['content-type'] === 'application/json') {\n      ctx.body = JSON.stringify(result);\n    } else {\n      ctx.body = result;\n    }\n  });\n\napp.listen(3000);\n```\n\n访问 `http://localhost:3000` 能看到API页面：\n\n![](https://pkxfpp.hk.aircodecdn.com/1689041097893.1689041115149_kl23ddnl3f.jpg)\n\n2. 直接使用 [AirCode](https://aircode.io)（推荐）\n\n```js\n// @see https://docs.aircode.io/guide/functions/\nconst aircode = require('aircode');\nconst {Mock} = require('mocor');\n\nconst mock = new Mock('hello', 'This is a demo api generated by mocor.');\n\nmock.post({\n  message: 'Hi, Mocor',\n});\n\nmodule.exports = mock.compile();\n```\n\n![](https://pkxfpp.hk.aircodecdn.com/1689041794483.1689041841020_vdq7d2n7vyp.jpg)\n\n## API 数据生成\n\nMocor 提供了功能强大的 API 生成辅助函数来生成各种数据，以下是 Mocor 内置的辅助函数：\n\n- randomFloat(from = 0, to = 1)\n  - 生成一个范围内的随机浮点数\n- randomInteger(from = 0, to = 1000)\n  - 生成一个范围内的随机整数\n- randomString(len = 16)\n  - 生成一个指定长度的随机字符串\n- randomUUID()\n  - 生成一个UUID字符串\n- randomDate(from = new Date(0), to = new Date())\n  - 生成一个指定时间范围的随机日期\n- repeat(schema, min = 3, max = min)\n  - 重复指定次数，生成列表\n- join(list, joint = '') \n  - 将列表连接成字符串\n\n### 例1\n\n下面这个[例子](https://5s6yh6diyc.us.aircode.run/random-list)生成5到10条学生信息，包括学生的名字、ID以及成绩。\n\n```js\n// @see https://docs.aircode.io/guide/functions/\nconst aircode = require('aircode');\nconst {Mock, repeat, randomInteger, randomUUID} = require('mocor');\n\nconst mock = new Mock('random list', 'This is a demo api generated by mocor.');\n\nconst genName = () =\u003e {\n  let i = 0;\n  return () =\u003e `student${i++}`;\n}\n\nmock.use(repeat({\n  name: genName(),\n  score: randomInteger(0, 101),\n  id: randomUUID(),\n}, 5, 10), {\n  allowMethods: ['GET', 'POST'],\n});\n\nmodule.exports = mock.compile();\n```\n\n- randomLatinLetter()\n  - 生成一个拉丁文（英文）字母\n- randomLatinWord(minLetters = 3, maxLatters = 12)\n  - 生成一个字母数量范围内的单词\n- randomLatinParagraph(minWords = 10, maxWords = 40)\n  - 生成一个由一定单词数量组成的段落\n- randomLatinArticle(minParagraph = 3, maxParagraph = 10)\n  - 生成一篇一定段落数量的文章\n- randomChineseName()\n  - 生成一个随机中文名\n- randomChineseParagraph()\n  - 生成一个随机的中文段落\n- randomChineseArticle(min = 200, max = 800)\n  - 生成一定字数的随机中文文章\n\n### 例2\n\n下面这个[例子](https://5s6yh6diyc.us.aircode.run/chinese-students)生成中文的学生信息：\n\n```js\n// @see https://docs.aircode.io/guide/functions/\nconst aircode = require('aircode');\nconst {Mock, repeat, randomInteger, randomUUID, randomChineseName, randomChineseArticle} = require('mocor');\n\nconst mock = new Mock('chinese students', 'This is a demo api generated by mocor.');\n\nmock.use(repeat({\n  name: randomChineseName(),\n  scores: repeat(randomInteger(50, 101), 5),\n  id: randomUUID(),\n  comment: randomChineseArticle(),\n}, 5, 10), {\n  allowMethods: ['GET', 'POST'],\n});\n\nmodule.exports = mock.compile();\n```\n\n- param(name, type = 'any', defaultValue = null, info = ' ') \n  - 使用传入的参数来生成数据\n- randomPick(...list)\n  - 从数组中等概率地获得随机值\n- randomPickWeight(...list)\n  - 根据每一条数据中的权重来随机获取值\n- poll(...list)\n  - 轮询数组中的值\n\n\n### 例3：\n\n下面这个[例子](https://5s6yh6diyc.us.aircode.run/param)根据不同的参数来返回不同的数据：\n\n```js\n// @see https://docs.aircode.io/guide/functions/\nconst aircode = require('aircode');\nconst {Mock, param} = require('mocor');\n\nconst mock = new Mock('params', 'This is a demo api generated by mocor.');\n\nmock.post((args) =\u003e {\n  const type = param('type', 'string', 'odd', 'get numbers even or odd')(args);\n  if(type === 'odd') return [1, 3, 5, 7, 9];\n  return [0, 2, 4, 6, 8];\n});\n\nmodule.exports = mock.compile();\n```\n\n### 例4：\n\n下面这个[例子](https://5s6yh6diyc.us.aircode.run/paged)模拟32条分页数据，根据 `page` 的值返回不同的数据条目：\n\n```js\n// @see https://docs.aircode.io/guide/functions/\nconst aircode = require('aircode');\nconst {Mock, param, repeat, randomChineseName, randomInteger} = require('mocor');\n\nconst mock = new Mock('params', 'This is a demo api generated by mocor.');\n\nmock.post((args) =\u003e {\n  const total = 32;\n  const pn = param('pn', 'number', 1, 'the page number')(args);\n  const n = Math.min(10, Math.max(0, total - (pn - 1) * 10));\n  return repeat({\n    name: randomChineseName(),\n    score: randomInteger(),\n  }, n);\n});\n\nmodule.exports = mock.compile();\n```\n\n### 例5：\n\n下面这个[例子](https://5s6yh6diyc.us.aircode.run/random-error)模拟一定概率下报错：\n\n```js\n// @see https://docs.aircode.io/guide/functions/\nconst aircode = require('aircode');\nconst {Mock, repeat, randomChineseName, randomInteger} = require('mocor');\n\nconst mock = new Mock('Random error', 'This is a demo api generated by mocor.');\n\nmock.post(({context}) =\u003e {\n  if(Math.random() \u003e 0.5) {\n    context.status(500);\n    return {\n      error: 'fatal error',\n    }\n  }\n  return repeat({\n    name: randomChineseName(),\n    score: randomInteger(),\n  }, 5);\n});\n\nmodule.exports = mock.compile();\n```\n\n## 高级用法\n\n如果你要先用模拟数据调试，随时切换到正式环境，那么在 AirCode 中，你可以这么做：\n\n首先创建模拟环境云函数 `student-mock.js`\n\n```js\n// @see https://docs.aircode.io/guide/functions/\nconst aircode = require('aircode');\nconst {Mock, repeat, randomInteger, randomUUID, randomChineseName, randomChineseArticle} = require('mocor');\n\nconst mock = new Mock('chinese students', 'This is a demo api generated by mocor.');\n\nmock.use(repeat({\n  name: randomChineseName(),\n  scores: repeat(randomInteger(50, 101), 5),\n  id: randomUUID(),\n  comment: randomChineseArticle(),\n}, 5, 10), {\n  allowMethods: ['GET', 'POST'],\n});\n\nmodule.exports = mock.compile();\n```\n\n然后用如下代码创建正式环境的 `student.js`\n\n```js\n// @see https://docs.aircode.io/guide/functions/\nconst aircode = require('aircode');\nconst {mocking} = require('mocor');\n\nmodule.exports = mocking(require('./student-mock.js'),\n  async function (params, context) {\n    console.log('Received params:', params);\n    return {\n      message: 'Hi, AirCode.',\n    };\n  });\n```\n\n这样我们访问[正式的 API ](https://5s6yh6diyc.us.aircode.run/student)就可以通过设置 HTTP 请求头 `x-motor` 值为 1 来使用模拟数据，不设置这个请求头则返回真实数据。\n\n而 API 文档仍然可以通过[模拟数据的云函数](https://5s6yh6diyc.us.aircode.run/student-mock)进行访问。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakira-cn%2Fmocor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fakira-cn%2Fmocor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakira-cn%2Fmocor/lists"}