mockServer.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. const chokidar = require("chokidar");
  2. const bodyParser = require("body-parser");
  3. const chalk = require("chalk");
  4. const path = require("path");
  5. const Mock = require("mockjs");
  6. const { baseURL } = require("../src/config/settings");
  7. const mockDir = path.join(process.cwd(), "mock");
  8. /**
  9. *
  10. * @param app
  11. * @returns {{mockStartIndex: number, mockRoutesLength: number}}
  12. */
  13. const registerRoutes = (app) => {
  14. let mockLastIndex;
  15. const { default: mocks } = require("./index.js");
  16. const mocksForServer = mocks.map((route) => {
  17. return responseFake(route.url, route.type, route.response);
  18. });
  19. for (const mock of mocksForServer) {
  20. app[mock.type](mock.url, mock.response);
  21. mockLastIndex = app._router.stack.length;
  22. }
  23. const mockRoutesLength = Object.keys(mocksForServer).length;
  24. return {
  25. mockRoutesLength: mockRoutesLength,
  26. mockStartIndex: mockLastIndex - mockRoutesLength,
  27. };
  28. };
  29. /**
  30. *
  31. * @param url
  32. * @param type
  33. * @param respond
  34. * @returns {{response(*=, *=): void, type: (*|string), url: RegExp}}
  35. */
  36. const responseFake = (url, type, respond) => {
  37. return {
  38. url: new RegExp(`${baseURL}${url}`),
  39. type: type || "get",
  40. response(req, res) {
  41. res.status(200);
  42. if (JSON.stringify(req.body) !== "{}") {
  43. console.log(chalk.green(`> 请求地址:${req.path}`));
  44. console.log(chalk.green(`> 请求参数:${JSON.stringify(req.body)}\n`));
  45. } else {
  46. console.log(chalk.green(`> 请求地址:${req.path}\n`));
  47. }
  48. res.json(
  49. Mock.mock(respond instanceof Function ? respond(req, res) : respond)
  50. );
  51. },
  52. };
  53. };
  54. /**
  55. *
  56. * @param app
  57. */
  58. module.exports = (app) => {
  59. require("@babel/register");
  60. app.use(bodyParser.json());
  61. app.use(
  62. bodyParser.urlencoded({
  63. extended: true,
  64. })
  65. );
  66. const mockRoutes = registerRoutes(app);
  67. let mockRoutesLength = mockRoutes.mockRoutesLength;
  68. let mockStartIndex = mockRoutes.mockStartIndex;
  69. chokidar
  70. .watch(mockDir, {
  71. ignored: /mock-server/,
  72. ignoreInitial: true,
  73. })
  74. .on("all", (event) => {
  75. if (event === "change" || event === "add") {
  76. try {
  77. app._router.stack.splice(mockStartIndex, mockRoutesLength);
  78. Object.keys(require.cache).forEach((item) => {
  79. if (item.includes(mockDir)) {
  80. delete require.cache[require.resolve(item)];
  81. }
  82. });
  83. const mockRoutes = registerRoutes(app);
  84. mockRoutesLength = mockRoutes.mockRoutesLength;
  85. mockStartIndex = mockRoutes.mockStartIndex;
  86. } catch (error) {
  87. console.log(chalk.red(error));
  88. }
  89. }
  90. });
  91. };