mock-server.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * @Author: your name
  3. * @Date: 2021-01-05 17:15:27
  4. * @LastEditTime: 2021-04-25 10:44:11
  5. * @LastEditors: Please set LastEditors
  6. * @Description: In User Settings Edit
  7. * @FilePath: \vue_3.0_test\src\mock\mock-server.js
  8. */
  9. // const bodyParser = require("body-parser");
  10. const express = require("express");
  11. const chokidar = require("chokidar");
  12. const chalk = require("chalk");
  13. const path = require("path");
  14. const Mock = require("mockjs");
  15. const apiDir = path.join(process.cwd(), "src/api");
  16. // 注册mock接口路径
  17. function registerRoutes(app) {
  18. let mockLastIndex;
  19. let mocksForServer = new Array();
  20. const api = require("./index.js");
  21. Object.keys(api).map((route) => {
  22. Object.keys(api[route]).map((item) => {
  23. api[route][item].mock &&
  24. mocksForServer.push(
  25. responseFake(
  26. api[route][item].url,
  27. api[route][item].type,
  28. api[route][item].response
  29. )
  30. );
  31. });
  32. });
  33. // 注册接口
  34. for (const mock of mocksForServer) {
  35. app[mock.type](mock.url, mock.response);
  36. mockLastIndex = app._router.stack.length;
  37. // console.log(app._router.stack[12])
  38. }
  39. // 获取接口的长度
  40. const mockRoutesLength = mocksForServer.length;
  41. // 注意:mockRoutesLength并不等于定于路由路径的数量,还包括其他路由
  42. // console.log(mockRoutesLength,mockLastIndex)
  43. return {
  44. mockRoutesLength,
  45. mockStartIndex: mockLastIndex - mockRoutesLength,
  46. };
  47. }
  48. // 模拟mock server
  49. const responseFake = (url, type, respond) => {
  50. return {
  51. url: url,
  52. type: type || "get",
  53. response: (req, res) => {
  54. console.log(chalk.red("请求", req.path));
  55. res.json(
  56. Mock.mock(
  57. respond instanceof Function ? respond(req, res) : respond
  58. )
  59. );
  60. },
  61. };
  62. };
  63. // 移除路由
  64. function unregisterRoutes() {
  65. Object.keys(require.cache).forEach((i) => {
  66. console.log(apiDir, i);
  67. if (i.includes(apiDir)) {
  68. delete require.cache[require.resolve(i)];
  69. }
  70. });
  71. }
  72. // 导出服务器app
  73. module.exports = (app) => {
  74. // 解析post数据
  75. app.use(express.json());
  76. app.use(
  77. express.urlencoded({
  78. extended: true,
  79. })
  80. );
  81. // 注册路由表到app上
  82. const mockRoutes = registerRoutes(app);
  83. let mockRoutesLength = mockRoutes.mockRoutesLength;
  84. let mockStartIndex = mockRoutes.mockStartIndex;
  85. //* 观察mock下的文件变化(不包括mock-server.js),热更新文件,这样添加数据路由就不用重启了
  86. chokidar
  87. .watch(apiDir, {
  88. ignored: /mock-server/,
  89. ignoreInitial: true,
  90. })
  91. .on("all", (event, path) => {
  92. try {
  93. // 先移除之前的路由
  94. app._router.stack.splice(mockStartIndex, mockRoutesLength);
  95. // 清除缓冲
  96. unregisterRoutes();
  97. // 重新注册路由
  98. const mockRoutes = registerRoutes(app);
  99. mockRoutesLength = mockRoutes.mockRoutesLength;
  100. mockStartIndex = mockRoutes.mockStartIndex;
  101. console.log(
  102. chalk.magentaBright(`\n > 接口更新成功 --> 详情 ${path}`)
  103. );
  104. } catch (err) {
  105. console.log(chalk.redBright(err));
  106. }
  107. });
  108. };