mock-server.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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 router = require('express').Router()
  7. const mockDir = path.join(process.cwd(), 'mock')
  8. function unregisterRoutes () {
  9. Object.keys(require.cache).forEach(i => {
  10. if (i.includes(mockDir)) {
  11. delete require.cache[require.resolve(i)]
  12. }
  13. })
  14. }
  15. // for mock server
  16. function responseFake(url, type, respond) {
  17. return {
  18. url: new RegExp(`${url}`),
  19. type: type || 'get',
  20. response (req, res) {
  21. console.log('request invoke:' + req.path)
  22. res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond))
  23. }
  24. }
  25. }
  26. function register (router) {
  27. const proxyCount = require('./proxy').register(router)
  28. const { mocks } = require('./index.js')
  29. const mocksForServer = mocks.map(route => {
  30. return responseFake(route.url, route.type, route.response)
  31. })
  32. for (const mock of mocksForServer) {
  33. router[mock.type](mock.url, mock.response)
  34. }
  35. }
  36. module.exports = app => {
  37. app.use(process.env.VUE_APP_BASE_API, router)
  38. app.use(bodyParser.json())
  39. app.use(bodyParser.urlencoded({
  40. extended: true
  41. }))
  42. register(router)
  43. // watch files, hot reload mock server
  44. chokidar.watch(mockDir, {
  45. ignored: /mock-server/,
  46. ignoreInitial: true
  47. }).on('all', (event, path) => {
  48. if (event === 'change' || event === 'add') {
  49. try {
  50. router.stack = []
  51. // clear routes cache
  52. unregisterRoutes()
  53. register(router)
  54. console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`))
  55. } catch (error) {
  56. console.log(chalk.redBright(error))
  57. }
  58. }
  59. })
  60. }