mock-server.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 mockDir = path.join(process.cwd(), 'mock')
  7. function registerRoutes(app) {
  8. let mockLastIndex
  9. const { mocks } = require('./index.js')
  10. const mocksForServer = mocks.map(route => {
  11. return responseFake(route.url, route.type, route.response)
  12. })
  13. for (const mock of mocksForServer) {
  14. // app[mock.type](mock.url, mock.response)
  15. app[mock.type](mock.url, bodyParser.json(), bodyParser.urlencoded({ extended: true }), mock.response)
  16. mockLastIndex = app._router.stack.length
  17. }
  18. const mockRoutesLength = Object.keys(mocksForServer).length
  19. return {
  20. mockRoutesLength: mockRoutesLength,
  21. mockStartIndex: mockLastIndex - mockRoutesLength
  22. }
  23. }
  24. function unregisterRoutes() {
  25. Object.keys(require.cache).forEach(i => {
  26. if (i.includes(mockDir)) {
  27. delete require.cache[require.resolve(i)]
  28. }
  29. })
  30. }
  31. // for mock server
  32. const responseFake = (url, type, respond) => {
  33. return {
  34. url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`),
  35. type: type || 'get',
  36. response(req, res) {
  37. console.log('request invoke:' + req.path)
  38. res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond))
  39. }
  40. }
  41. }
  42. module.exports = app => {
  43. // parse app.body
  44. // https://expressjs.com/en/4x/api.html#req.body
  45. // app.use(bodyParser.json())
  46. // app.use(bodyParser.urlencoded({
  47. // extended: true
  48. // }))
  49. const mockRoutes = registerRoutes(app)
  50. var mockRoutesLength = mockRoutes.mockRoutesLength
  51. var mockStartIndex = mockRoutes.mockStartIndex
  52. // watch files, hot reload mock server
  53. chokidar.watch(mockDir, {
  54. ignored: /mock-server/,
  55. ignoreInitial: true
  56. }).on('all', (event, path) => {
  57. if (event === 'change' || event === 'add') {
  58. try {
  59. // remove mock routes stack
  60. app._router.stack.splice(mockStartIndex, mockRoutesLength)
  61. // clear routes cache
  62. unregisterRoutes()
  63. const mockRoutes = registerRoutes(app)
  64. mockRoutesLength = mockRoutes.mockRoutesLength
  65. mockStartIndex = mockRoutes.mockStartIndex
  66. console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`))
  67. } catch (error) {
  68. console.log(chalk.redBright(error))
  69. }
  70. }
  71. })
  72. }