mock-server.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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 compression = require('compression')
  7. const mockDir = path.join(process.cwd(), 'mock')
  8. function registerRoutes(app) {
  9. let mockLastIndex
  10. const { mocks } = require('./index.js')
  11. const mocksForServer = mocks.map(route => {
  12. return responseFake(route.url, route.type, route.response)
  13. })
  14. for (const mock of mocksForServer) {
  15. app[mock.type](mock.url, 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. // sse
  46. app.use(compression())
  47. app.get('/api/subscribe/test1', (req, res) => {
  48. req.socket.setTimeout(0)
  49. req.socket.setNoDelay(true)
  50. req.socket.setKeepAlive(true)
  51. res.statusCode = 200
  52. res.setHeader('Content-Type', 'text/event-stream')
  53. res.setHeader('Cache-Control', 'no-cache')
  54. res.write('data: welcome!\n\n')
  55. res.flush()
  56. const timer = setInterval(function() {
  57. res.write(`event: message\ndata: {"messageInfoReq":{"messageType":1,"scopeIds":"2","readStatus":0,"title":"test11111111","t":${new Date().getTime()}},"clientIds":["test1"]}\n\n`)
  58. res.flush()
  59. }, 5000)
  60. res.on('close', function() {
  61. clearInterval(timer)
  62. })
  63. })
  64. app.use(bodyParser.json())
  65. app.use(bodyParser.urlencoded({
  66. extended: true
  67. }))
  68. const mockRoutes = registerRoutes(app)
  69. var mockRoutesLength = mockRoutes.mockRoutesLength
  70. var mockStartIndex = mockRoutes.mockStartIndex
  71. // watch files, hot reload mock server
  72. chokidar.watch(mockDir, {
  73. ignored: /mock-server/,
  74. ignoreInitial: true
  75. }).on('all', (event, path) => {
  76. if (event === 'change' || event === 'add') {
  77. try {
  78. // remove mock routes stack
  79. app._router.stack.splice(mockStartIndex, mockRoutesLength)
  80. // clear routes cache
  81. unregisterRoutes()
  82. const mockRoutes = registerRoutes(app)
  83. mockRoutesLength = mockRoutes.mockRoutesLength
  84. mockStartIndex = mockRoutes.mockStartIndex
  85. console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`))
  86. } catch (error) {
  87. console.log(chalk.redBright(error))
  88. }
  89. }
  90. })
  91. }