mock-server.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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 routes = []
  26. try {
  27. fs.readdirSync(path.join(__dirname, 'routes')).forEach(file => {
  28. const mocks = require(`./routes/${file}`)
  29. if (Array.isArray(mocks)) {
  30. routes.push(...mocks)
  31. }
  32. })
  33. } catch (e) {
  34. console.log('no mock routes', e)
  35. }
  36. routes.forEach(route => {
  37. const { type, url, response } = responseFake(route.url, route.type, route.response)
  38. router[type](url, response)
  39. })
  40. }
  41. function unregister () {
  42. router.stack = []
  43. // clear routes cache
  44. Object.keys(require.cache).forEach(i => {
  45. if (i.includes(mockDir)) {
  46. delete require.cache[require.resolve(i)]
  47. }
  48. })
  49. }
  50. module.exports = app => {
  51. app.use(process.env.VUE_APP_BASE_API, router)
  52. register(router)
  53. // watch files, hot reload mock server
  54. chokidar.watch(mockDir, {
  55. ignored: /mock-server/,
  56. ignoreInitial: true
  57. }).on('all', (event, path) => {
  58. if (event === 'change' || event === 'add') {
  59. try {
  60. unregister()
  61. register(router)
  62. console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`))
  63. } catch (error) {
  64. console.log(chalk.redBright(error))
  65. }
  66. }
  67. })
  68. }