{"id":20345660,"url":"https://github.com/kscript/mock","last_synced_at":"2025-04-12T00:41:08.847Z","repository":{"id":33146837,"uuid":"152734522","full_name":"kscript/mock","owner":"kscript","description":"方便前端开发调试的mock服务器, 使用 json-server 搭建. 支持 文件上传/静态文件服务、https、触发鉴权、模拟接口、模拟请求错误、转发请求、异步操作 等功能","archived":false,"fork":false,"pushed_at":"2023-01-04T21:59:17.000Z","size":1123,"stargazers_count":5,"open_issues_count":15,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-25T20:22:05.189Z","etag":null,"topics":["api","file-server","http-server","https","js","json","json-server","mock","mockjs","multer","static-service","upload","upload-file"],"latest_commit_sha":null,"homepage":"https://kscript.github.io/mock/","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/kscript.png","metadata":{"files":{"readme":"README.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}},"created_at":"2018-10-12T10:29:24.000Z","updated_at":"2024-11-29T03:01:10.000Z","dependencies_parsed_at":"2023-01-14T23:36:28.690Z","dependency_job_id":null,"html_url":"https://github.com/kscript/mock","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kscript%2Fmock","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kscript%2Fmock/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kscript%2Fmock/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kscript%2Fmock/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kscript","download_url":"https://codeload.github.com/kscript/mock/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248501960,"owners_count":21114681,"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","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","file-server","http-server","https","js","json","json-server","mock","mockjs","multer","static-service","upload","upload-file"],"created_at":"2024-11-14T22:09:18.441Z","updated_at":"2025-04-12T00:41:08.827Z","avatar_url":"https://github.com/kscript.png","language":"JavaScript","readme":"## ks-mock\n一个模拟服务端api的工具, 支持 https、触发鉴权、模拟接口、模拟请求错误、转发请求、异步操作 等功能\n\n## npm命令\n``` npm\n  # 用于构建mock服务器\n  npm run bundle\n\n  # webpack 插件模式\n  npm run build\n\n  # 打包并运行mock服务器\n  npm run mock\n```\n\n## 使用场景\n### 1. 作为单独的 mock 服务器使用\n下载\n```git\n  git clone https://github.com/kscript/mock.git\n```\n安装\n```npm\n  npm i\n```\n运行\n```npm\n  npm run mock\n```\n项目运行后, 打开首页(http://localhost:3030) 可查看demo\n\n\n### 2. 在项目中使用\n- 安装\n```npm\n  npm i ks-mock -D\n```\n- 添加 mock 文件夹, 参照如下示例, 添加入口文件 index.js 和处理用于处理返回数据的文件 datas.js\n\n\n```javascript\n// index.js\nconst KsMock = require(\"ks-mock\");\nconst datas = require('./datas.js');\nnew KsMock({\n    mockData: datas,\n    headConfig: null,\n    crossDomain: true,\n    port: 3030,\n    loginUrl: 'login',\n    https: {\n      key: '',\n      cert: ''\n    }\n}).server();\n```\n```javascript\n// datas.js\nmodule.exports = {\n    login: {\n        format: (method, params, result, { body }) =\u003e {\n          Object.assign(result.data, params);\n          // 同步\n          return result\n          // 异步\n          return new Promise((resolve, reject) =\u003e {\n            setTimeout(() =\u003e {\n              // reject(result)\n              resolve(result)\n            }, 1e4)\n          })\n        },\n        post: {\n          data: {},\n          message: \"登录成功!\"\n        }\n    },\n};\n```\n\n- 在 package.json 添加命令\n```\n\"mock\": \"node mock\"\n```\n\n### 3. 作为 webpack 插件使用\n安装\n```npm\n  npm i ks-mock -D\n```\n使用\n```javascript\n// webpack.config.js\nconst path = require('path');\nconst KsMock = require(\"ks-mock\");\nmodule.exports = {\n  ...\n  plugins: [\n    new KsMock({\n      // // 静态文件目录\n      // static: path.join(__dirname, 'upload'),\n\n      // 上传文件/写入文件前的钩子\n      // beforeUpload(req, file, done) {\n      //   // 参数: 错误对象, 要存储的目录\n      //   done(null, '')\n      // },\n      // beforeWrite(req, file, done) {\n      //   // 参数: 错误对象, 要存储的文件名\n      //   done(null, '')\n      // },\n\n      mockData: {},\n      headConfig: null,\n      crossDomain: true,\n      port: 3030,\n\n      // // 配置路由重写规则\n      // rules: {\n      //   '/api/*': '/api?name=$1'\n      // },\n\n      // // 配置https证书\n      // https: {\n      //   key: '',\n      //   cert: ''\n      // }\n    })\n    ...\n  ]\n}\n```\n\n### 目录结构\n|- public  \u003cfont color=\"green\"\u003edemo文件夹\u003c/font\u003e  \n|- src  \u003cfont color=\"green\"\u003e源码文件夹\u003c/font\u003e  \n|- -- auth.ts  \u003cfont color=\"green\"\u003e用户权限\u003c/font\u003e  \n|- -- config.ts  \u003cfont color=\"green\"\u003emock服务器的一些配置\u003c/font\u003e  \n|- -- datas.ts  \u003cfont color=\"green\"\u003e返回数据\u003c/font\u003e  \n|- -- index.ts  \u003cfont color=\"green\"\u003e插件模式入口\u003c/font\u003e  \n|- -- localhost.ts  \u003cfont color=\"green\"\u003emock服务器模式入口\u003c/font\u003e  \n|- -- rules.ts  \u003cfont color=\"green\"\u003e路由重写规则\u003c/font\u003e  \n|- -- server.ts  \u003cfont color=\"green\"\u003emock服务器实例\u003c/font\u003e  \n|- -- utils.ts  \u003cfont color=\"green\"\u003e一些用到的方法\u003c/font\u003e  \n|- ssl  \u003cfont color=\"green\"\u003eSSL证书\u003c/font\u003e  \n|- db.json  \u003cfont color=\"green\"\u003ejson-server数据库(在其它项目中使用时, 会在process.cwd()目录生成)\u003c/font\u003e  \n|- index.js  \u003cfont color=\"green\"\u003erollup打包后的插件入口\u003c/font\u003e  \n|- localhost.js  \u003cfont color=\"green\"\u003erollup打包后的 mock服务器 入口\u003c/font\u003e  \n|- package.json  \n|- rollup.config.js  \u003cfont color=\"green\"\u003erollup配置\u003c/font\u003e  \n\n string | ((jsonServer: Object, server: Object) =\u003e void)\n### 配置项\n|属性|类型|默认值|说明|\n|--|--|--|--|\n| mockData | object | {} | 模拟属性相关的配置 |\n| headConfig | object | null | 服务器请求头设置 |\n| crossDomain | boolean | true | 是否允许跨域 当 headConfig 不为空时, 忽略该项 |\n| port | number | 3030 | 端口号 |\n| static | object/function | __dirname + '/public' | 静态文件目录 |\n| beforeUpload | function | undefined | 上传文件前的钩子 |\n| beforeWrite | function | undefined | 写入文件前的钩子 |\n| https | object/undefined | undefined | https配置 |\n| rules | object | - | 路由重写规则, 参考 [json-server rewriter](https://github.com/typicode/json-server#rewriter-example) |\n| loginUrl | string | - | 登录地址, 如果配置了loginUrl, 那么除登录和public属性为true的接口外, 其它接口必须在登录之后才可以正常执行 |\n| logoutUrl | string | - | 退出登录地址 |\n| interceptor | function | - | 拦截器, 用于拦截/修改发送的请求 |\n\nmockData 属性, 存放客户端请求api时的返回数据, 以及对返回数据的一些操作  \n支持的可选操作有: \n1. 对返回数据的包装\n2. 返回错误信息\n3. 转发请求\n\n返回数据支持 mock.js 中的写法, [查看 mock.js 使用文档](https://github.com/nuysoft/Mock/wiki), 但如果是被 鉴权/错误处理/转发请求 拦截, 那么 mock.js 写法无效\n\n``` js\n  {\n    // 请求地址\n    url: {\n      // 默认除登录外的接口都需要鉴权, 但设置了public, 则表示当前接口不需要鉴权\n      public: true,\n      /**\n       * 对模拟返回的数据进行包装\n       * @func\n       * @param {string} method 请求方法\n       * @param {object} params 请求参数\n       * @param {any} result 默认返回结果的副本\n       * @desc 无返回值时, 则放弃修改\n       */\n      format: (method, params, result) =\u003e {}, \n      /**\n       * 对模拟返回的数据进行包装\n       * @func\n       * @param {string} method 请求方法\n       * @param {object} params 请求参数\n       * @param {any} result 默认返回结果的副本\n       * @desc 返回值说明: \n       * 1. function(res, headConfig) - 通过方法来自定义报错信息\n       * 2. object - 作为报错信息 \n       * 3. string - 作为报错信息内容 (使用默认的报错结构)\n       * 4. 其它 - 没有错误, 继续向下执行~\n       */\n      error: (method, params, result) =\u003e {\n        // 1\n        return function(res, headConfig){\n          res.writeHead(400, headConfig)\n          res.end(JSON.stringify({\n            code: 400,\n            message: '未知错误'\n          }))\n        }\n        // 2\n        return {\n          code: 400,\n          message: '未知错误'\n        }\n        // 3\n        return '未知错误'\n      }, \n      /**\n       * 转发请求\n       * @func\n       * @param {string} method 请求方法\n       * @param {object} params 请求参数\n       * @param {any} result 默认返回结果的副本\n       * @desc relay 可以是一个url字符串\n       * @returns string/object/array\n      */\n      relay: (method, params, result) =\u003e {\n        let url = ''\n        // 返回值用于给 request 模块传参, 调用逻辑:\n        // request.apply(request, Array.isArray(returns) ? returns : [returns])\n        // request中的传参字段: get为qs, post为form\n        return url\n        // return {\n        //   url,\n        //   [/post/i.test(method) ? 'form' : 'qs']: {\n        //     test: 123\n        //   }\n        // }\n        // return [url, {\n        //   [/post/i.test(method) ? 'form' : 'qs']: {\n        //     test: 123\n        //   }\n        // }]\n      },\n\n      // 请求方法, 返回数据\n      // 返回数据可以使用 mockjs 来填充数据, 也可以直接写json\n\n      // 请求方法为函数时, 参数与format/error/ralay等方法一致, 但result为空对象, 返回值作为返回数据\n      // get: (method, params, result) =\u003e {}\n      get: {\n        // ...\n      },\n      // 如果在 db.json 中配置了当前url, 则post请求会被 json-server 拦截\n      // 请求被拦截的优先级: 鉴权 \u003e 错误处理error \u003e 转发请求relay \u003e json-server\n      post: {\n        // ...\n      },\n    }\n  }\n```\n\n### 流程图\n![流程图](./flowsheet.svg)\n\n### License\nMIT\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkscript%2Fmock","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkscript%2Fmock","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkscript%2Fmock/lists"}