/* * @Author: your name * @Date: 2021-01-05 17:15:27 * @LastEditTime: 2021-04-25 10:44:11 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit * @FilePath: \vue_3.0_test\src\mock\mock-server.js */ // const bodyParser = require("body-parser"); const express = require("express"); const chokidar = require("chokidar"); const chalk = require("chalk"); const path = require("path"); const Mock = require("mockjs"); const apiDir = path.join(process.cwd(), "src/api"); // 注册mock接口路径 function registerRoutes(app) { let mockLastIndex; let mocksForServer = new Array(); const api = require("./index.js"); Object.keys(api).map((route) => { Object.keys(api[route]).map((item) => { api[route][item].mock && mocksForServer.push( responseFake( api[route][item].url, api[route][item].type, api[route][item].response ) ); }); }); // 注册接口 for (const mock of mocksForServer) { app[mock.type](mock.url, mock.response); mockLastIndex = app._router.stack.length; // console.log(app._router.stack[12]) } // 获取接口的长度 const mockRoutesLength = mocksForServer.length; // 注意:mockRoutesLength并不等于定于路由路径的数量,还包括其他路由 // console.log(mockRoutesLength,mockLastIndex) return { mockRoutesLength, mockStartIndex: mockLastIndex - mockRoutesLength, }; } // 模拟mock server const responseFake = (url, type, respond) => { return { url: url, type: type || "get", response: (req, res) => { console.log(chalk.red("请求", req.path)); res.json( Mock.mock( respond instanceof Function ? respond(req, res) : respond ) ); }, }; }; // 移除路由 function unregisterRoutes() { Object.keys(require.cache).forEach((i) => { console.log(apiDir, i); if (i.includes(apiDir)) { delete require.cache[require.resolve(i)]; } }); } // 导出服务器app module.exports = (app) => { // 解析post数据 app.use(express.json()); app.use( express.urlencoded({ extended: true, }) ); // 注册路由表到app上 const mockRoutes = registerRoutes(app); let mockRoutesLength = mockRoutes.mockRoutesLength; let mockStartIndex = mockRoutes.mockStartIndex; //* 观察mock下的文件变化(不包括mock-server.js),热更新文件,这样添加数据路由就不用重启了 chokidar .watch(apiDir, { ignored: /mock-server/, ignoreInitial: true, }) .on("all", (event, path) => { try { // 先移除之前的路由 app._router.stack.splice(mockStartIndex, mockRoutesLength); // 清除缓冲 unregisterRoutes(); // 重新注册路由 const mockRoutes = registerRoutes(app); mockRoutesLength = mockRoutes.mockRoutesLength; mockStartIndex = mockRoutes.mockStartIndex; console.log( chalk.magentaBright(`\n > 接口更新成功 --> 详情 ${path}`) ); } catch (err) { console.log(chalk.redBright(err)); } }); };