mock-server.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. const fs = require('fs')
  2. const path = require('path')
  3. const chalk = require('chalk')
  4. const chokidar = require('chokidar')
  5. const express = require('express')
  6. const Mock = require('mockjs')
  7. const router = express.Router()
  8. const mockDir = path.join(process.cwd(), 'mock')
  9. function responseFake(url, type, respond) {
  10. return {
  11. url: new RegExp(`${url}`),
  12. type: type || 'get',
  13. response (req, res) {
  14. console.log('request invoke:' + req.path)
  15. res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond))
  16. }
  17. }
  18. }
  19. function register (router) {
  20. require('./proxy').register(router)
  21. router.use(express.json())
  22. router.use(express.urlencoded({
  23. extended: true
  24. }))
  25. const routeDir = path.join(__dirname, 'routes')
  26. if (fs.existsSync(routeDir)) {
  27. const routes = []
  28. fs.readdirSync(routeDir).forEach(file => {
  29. const mocks = require(`./routes/${file}`)
  30. if (Array.isArray(mocks) && mocks.length) {
  31. routes.push(...mocks)
  32. }
  33. })
  34. routes.forEach(route => {
  35. const { type, url, response } = responseFake(route.url, route.type, route.response)
  36. router[type](url, response)
  37. })
  38. } else {
  39. console.log('no mock routes')
  40. }
  41. }
  42. function unregister () {
  43. router.stack = []
  44. // clear routes cache
  45. Object.keys(require.cache).forEach(i => {
  46. if (i.includes(mockDir)) {
  47. delete require.cache[require.resolve(i)]
  48. }
  49. })
  50. }
  51. module.exports = app => {
  52. app.use(process.env.VUE_APP_BASE_API, router)
  53. register(router)
  54. // watch files, hot reload mock server
  55. chokidar.watch(mockDir, {
  56. ignored: /mock-server/,
  57. ignoreInitial: true
  58. }).on('all', (event, path) => {
  59. if (event === 'change' || event === 'add') {
  60. try {
  61. unregister()
  62. register(router)
  63. console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`))
  64. } catch (error) {
  65. console.log(chalk.redBright(error))
  66. }
  67. }
  68. })
  69. }