{"_rev":"19-5dcde5578aad324627cc08ae6e0a27d8","time":{"created":"2025-06-23T02:39:30.956Z","modified":"2025-06-23T02:39:31.462Z","1.0.0":"2018-10-14T14:49:03.098Z","1.0.1":"2018-10-15T08:09:13.370Z","1.0.2":"2018-10-15T08:31:35.326Z","1.0.3":"2018-10-15T10:26:06.563Z","1.1.3":"2018-10-16T02:12:12.435Z","1.2.3":"2018-10-21T06:52:57.926Z","1.2.4":"2018-12-14T07:43:39.376Z","1.3.4":"2019-02-24T08:53:53.982Z","2.0.0":"2020-08-19T08:38:58.600Z","2.0.1":"2020-08-19T08:52:49.467Z","2.0.2":"2022-02-25T03:51:00.483Z","2.0.3":"2022-02-25T06:16:39.060Z","2.0.4":"2022-03-25T09:59:59.390Z","3.0.0":"2025-06-05T09:43:33.304Z","3.0.1":"2025-06-20T01:39:55.757Z","3.0.2":"2025-06-20T01:48:26.080Z","3.0.3":"2025-06-23T02:39:31.178Z"},"_id":"l-mock","name":"l-mock","dist-tags":{"latest":"3.0.3"},"versions":{"3.0.3":{"name":"l-mock","version":"3.0.3","keywords":["mock","local-mock","mockjs"],"description":"The easiest way to mock data","homepage":"https://github.com/fwon/l-mock","repository":{"type":"git","url":"git+https://github.com/fwon/l-mock.git"},"bugs":{"url":"https://github.com/fwon/l-mock/issues"},"main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1","start":"node server.js"},"bin":{"l-mock":"bin/index.js","lmock":"bin/index.js"},"author":{"name":"wfn3664"},"license":"MIT","dependencies":{"body-parser":"^1.18.3","chalk":"^2.4.1","coexist-parser-proxy":"^1.0.7","commander":"^7.1.0","cors":"^2.8.4","directory-tree":"^2.2.4","ejs":"^3.1.3","express":"^4.16.4","fs-extra":"^10.0.1","http-proxy-middleware":"^2.0.4","ip":"^1.1.5","mockjs":"^1.0.1-beta3","multer":"^1.4.1","nodemon":"^2.0.15","ora":"^3.0.0","portfinder":"^1.0.28","semver":"^7.3.4","socket.io":"^4.4.1","socket.io-client":"^4.4.1","supervisor":"^0.12.0","ws":"^8.5.0"},"engines":{"node":"^12.0.0 || >=14.0.0"},"devDependencies":{"eslint":"^8.12.0"},"_id":"l-mock@3.0.3","gitHead":"5722f722593bd26ff0e430ef152f1da3442a4b15","_nodeVersion":"23.11.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-7h5HU3au6Nlp1n5nTOAzlawnDdD48Dy+5XUee9N7/9TBsLX7CpYBrhc1XbzI7aBGutM7sXp7beZeOTW8fls9DQ==","shasum":"bbdc73046d996096022d90870157a9670d9981a2","tarball":"https://registry.npmjs.org/l-mock/-/l-mock-3.0.3.tgz","fileCount":608,"unpackedSize":8577129,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD7wChbRYmNTXdg6TGgRCEkDGgGZ4isVZVzAQlxrr/MhQIhAO/efPdU+ff3cKfasEuyRRU7LfjKOjyOjQkv3TvFYHKz"}]},"_npmUser":{"name":"fwon","email":"331749055@qq.com","actor":{"name":"fwon","email":"331749055@qq.com","type":"user"}},"directories":{},"maintainers":[{"name":"fwon","email":"331749055@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/l-mock_3.0.3_1750646370956_0.23779401110147536"},"_hasShrinkwrap":false}},"maintainers":[{"name":"fwon","email":"331749055@qq.com"}],"description":"The easiest way to mock data","homepage":"https://github.com/fwon/l-mock","keywords":["mock","local-mock","mockjs"],"repository":{"type":"git","url":"git+https://github.com/fwon/l-mock.git"},"author":{"name":"wfn3664"},"bugs":{"url":"https://github.com/fwon/l-mock/issues"},"license":"MIT","readme":"# l-mock\r\n\r\n### 说明\r\n\r\n服务端接口Mock命令行工具，支持数据模拟/数据模型/接口代理/接口调试\r\n\r\n### 依赖\r\n```\r\nnodejs >=12.0.0\r\n```\r\n### 安装\r\n```\r\nnpm i -g l-mock\r\n\r\n```\r\n\r\n### 快速启动\r\n\r\n1. 定位到项目目录\r\n\r\n```\r\ncd path/to/project\r\n```\r\n\r\n2. 初始化接口目录:\r\n\r\n```\r\nlmock init\r\n```\r\n\r\n> `init` 命令会在项目根目录下创建默认文件夹 mock，通过`--dir`参数可指定目录名\r\n\r\n3.定位到 mock 目录并启动\r\n\r\n```\r\ncd mock && lmock start\r\n```\r\n\r\n### 启动参数\r\n\r\n| 参数 | 说明 |\r\n| ---- | ---- |\r\n| `-p` | 可选，默认监听 3000 端口，可通过`-p`配置端口，支持多项目同时 mock |\r\n| `-u` | 可选，同时启动 UI 编辑界面 |\r\n| `-ws` | 可选，同时启动websocket服务器 |\r\n| `-io` | 可选，同时启动Socket.io服务器 |\r\n| `-sp` | 可选，websocket服务的端口，默认为 4000 |\r\n\r\n访问`localhost:3000/a` 成功返回数据\r\n\r\n访问`localhost:3000/ui` 调起 UI 界面\r\n\r\n### 接口格式\r\n\r\n| Params      | Value                 | Description                                                                                                                                                                                             |\r\n| ----------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\r\n| url         | /xx                   | 请求 api, 支持正则的[匹配模式](https://expressjs.com/en/4x/api.html#path-examples)                                                                                                                      |\r\n| method      | get/post/put/delete   | 请求方法                                                                                                                                                                                                |\r\n| dataType    | jsonp                 | **可选** 当请求为 jsonp 时需配置该项，仅当 result 为 JSON 时生效，为 function 时要自己处理返回                                                                                                          |\r\n| contentType | `application/x-www-form-urlencoded` | **可选** 当方法为`post`且请求类型为`application/x-www-form-urlencoded`时，需配置该参数                                                                                                                                |\r\n| test        | http://test/api/1     | **可选** 将请求代理到测试地址，当配置 product 时，优先代理 product                                                                                                                                      |\r\n| product     | http://prod/api/1     | **可选** 将请求代理到正式地址                                                                                                                                                                           |\r\n| result      | JSON/Function         | **JSON** 直接配置静态/动态数据，动态数据的配置可参考 [Mockjs](http://mockjs.com/examples.html)<br>**Function** 支持返回一个方法，你可以读取请求参数进行一些判断, 并返回自定义内容，支持 Mock 和文件读取 |\r\n\r\n### 接口例子\r\n\r\n1. 返回 JSON 格式数据\r\n\r\n```javascript\r\n/*\r\n  最简单也是最常用的返回json格式数据，变量语法可参考 http://mockjs.com/examples.html\r\n */\r\n\r\nmodule.exports = {\r\n  url: '/a',\r\n  method: 'get',\r\n  result: {\r\n    'status|1': [\"no_login\", \"OK\", \"error\", \"not_registered\"],             'msg': '@csentence()',\r\n    'data': {\r\n      a: 2\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n2. 返回 JSONP 格式数据\r\n\r\n```javascript\r\n/*\r\n  返回简单的json数据，变量语法可参考 http://mockjs.com/examples.html\r\n */\r\n\r\nmodule.exports = {\r\n  url: \"/a\",\r\n  method: \"get\",\r\n  dataType: \"jsonp\",\r\n  result: {\r\n    \"status|1\": [\r\n      \"no_login\",\r\n      \"OK\",\r\n      \"error\",\r\n      \"not_registered\",\r\n      \"account_reviewing\",\r\n    ],\r\n    msg: \"@csentence()\",\r\n    data: {\r\n      a: 2,\r\n    },\r\n  },\r\n};\r\n```\r\n\r\n3. 自定义函数\r\n\r\n```javascript\r\n/*\r\n  用户可以自定义返回函数，采用express语法application/x-www-form-urlencoded，需设置contentType参数\r\n */\r\n\r\nmodule.exports = {\r\n  url: \"/b\",\r\n  method: \"post\",\r\n  contentType: \"application/x-www-form-urlencoded\",\r\n  result: function (req, res) {\r\n    // POST方法req.body获取请求信息\r\n    if (req.body.name === \"admin\" && req.body.password === \"admin\") {\r\n      res.send({\r\n        msg: \"登录成功！\",\r\n        code: 0,\r\n        authorization: \"fdjflsjflfds4f5df5s4f5d4f5s\",\r\n      });\r\n    } else {\r\n      res.send({ msg: \"账号或者密码错误！\", code: 1 });\r\n    }\r\n  },\r\n};\r\n```\r\n\r\n4. 支持 Model 数据结构引用\r\n\r\n```javascript\r\n/*\r\n  饮用model文件夹中的模型\r\n*/\r\n\r\n// model/user.js\r\nmodule.exports = {\r\n  avatar: \"@image(100x100)\",\r\n  nickname: \"@cname\",\r\n  user_type: 1,\r\n  vip: 1,\r\n};\r\n\r\n// api/d.js\r\nmodule.exports = {\r\n  url: \"/d\",\r\n  method: \"get\",\r\n  result: function (req, res) {\r\n    const Mock = res.Mock;\r\n    const User = res.require(\"model/user\");\r\n    const json = {\r\n      status: \"ok\",\r\n      data: {\r\n        user: User,\r\n      },\r\n    };\r\n    res.send(Mock.mock(json));\r\n  },\r\n};\r\n```\r\n\r\n5. 动态 Mock 和文件读取\r\n\r\n```javascript\r\n/*\r\n  通过(:value)动态设置url参数\r\n  通过res.require引入模块文件\r\n */\r\n\r\nmodule.exports = {\r\n  url: \"/c/:id\",\r\n  method: \"get\",\r\n  result: function (req, res) {\r\n    const Mock = res.Mock;\r\n    const json = res.require(\"model/c\");\r\n    // url 参数通过req.params获取，?xxx=xx参数通过req.query获取\r\n    if (req.params.id === \"1\") {\r\n      // res.cookie('name', 'tobi', { domain: '.example.com', path: '/admin', secure: true });\r\n      res.send({ msg: \"获取用户\" + req.params.id + \"信息成功\" });\r\n    } else {\r\n      res.send(Mock.mock(json));\r\n    }\r\n  },\r\n};\r\n```\r\n\r\n6. 代理接口\r\n\r\n```javascript\r\n/*\r\n  接口代理的使用，直接代理到正式/测试地址，可解决跨域问题\r\n */\r\n\r\nmodule.exports = {\r\n  url: \"/a/v1/emoticons/list/public\",\r\n  method: \"get\",\r\n  test: \"https://removeserver.com\",\r\n  result: {}\r\n};\r\n```\r\n\r\n### WebSocket调试\r\n\r\n启动命令：`lmock start -u -ws` 或 `lmock start -u -io` （打开UI功能，选择原生websocket或socket.io）\r\n\r\nwebsocket接口定义于`/socket`文件夹下，格式如同HTTP API。\r\n\r\n| Params | Type | Description |\r\n| ------ | ----- | ----------- |\r\n| name   | String | 事件名称，客户端通过此名称监听事件 |\r\n| interval | Number | **可选** 定时发送事件的间隔时间(毫秒) |\r\n| timeout | Number | **可选** 延迟发送事件的时间(毫秒)，与interval互斥 |\r\n| result | JSON | 事件数据，支持Mock.js语法动态生成数据 |\r\n\r\n1.定时发送数据（ws连接建立后会自动发送数据）\r\n```javascript\r\nmodule.exports = {\r\n  name: \"acc_info\",\r\n  interval: 9000,\r\n  // timeout: 5000,\r\n  result: {\r\n    'game_cnt': '@integer(100, 1000)',\r\n    'game_cnt_rank': '@float(0.1, 1.0, 2)',\r\n  }\r\n};\r\n```\r\n\r\n2.手动触发数据\r\n```javascript\r\nmodule.exports = {\r\n  name: \"user_info\",\r\n  result: {\r\n    status: 'ok',\r\n    data: {\r\n      name: '@cfirst()',\r\n      age: '@integer(10, 100)',\r\n      gender: '@pick([\"男\", \"女\"])',\r\n      address: '@city()'\r\n    }\r\n  }\r\n}\r\n```\r\n手动触发数据需要通过可视化的UI界面：\r\n\r\n**操作步骤：** 选中mock文件 ——> 点击连接（选择连接方式）——> 点击发往客户端\r\n\r\n#### 开发调试\r\nUI工具中的WebSocket客户端仅做为连通性测试和数据查看，开发中请从业务代码中连接WebSocket Mock服务器，如：\r\n```javascript\r\nconst socket = new WebSocket(`ws://192.168.0.1:4000`)\r\n```\r\n\r\n#### 测试服务端接口\r\n可视化工具支持测试服务端websocket接口，一般用于校验websocket连通性，通过配置ws服务端地址和配置项进行连接，可自行尝试。\r\n\r\n\r\n\r\n### 项目快速配置\r\n\r\n工具也可以只安装在项目中作为开发依赖，不用全局安装\r\n\r\n```\r\nnpm i l-lmock --save-dev\r\n```\r\n\r\n修改 package.json 中的 scripts\r\n\r\n```\r\n\"scripts\": {\r\n  \"mock\": \"cd mock && lmock start\",\r\n}\r\n```\r\n\r\n运行时执行 `npm run mock`\r\n\r\n### API 用法\r\n\r\n除了用命令行模式开启服务，还可通过与工程脚本配合，用代码启动服务\r\n\r\n```javascript\r\nconst path = require(\"path\");\r\nconst lmock = require(\"l-mock\");\r\nconst mockDir = path.resolve(\"./mock/\");\r\nconst port = 4000;\r\n\r\nlmock.start(mockDir, port);\r\n```\r\n\r\n### Future features\r\n1. 一键部署外链\r\n...","readmeFilename":"README.md"}