mock-server.js 2.23 KB
Newer Older
花裤衩's avatar
花裤衩 committed
1 2 3 4
const chokidar = require('chokidar')
const bodyParser = require('body-parser')
const chalk = require('chalk')
const path = require('path')
5
const Mock = require('mockjs')
花裤衩's avatar
花裤衩 committed
6 7 8 9 10

const mockDir = path.join(process.cwd(), 'mock')

function registerRoutes(app) {
  let mockLastIndex
11
  const { mocks } = require('./index.js')
12 13 14 15
  const mocksForServer = mocks.map(route => {
    return responseFake(route.url, route.type, route.response)
  })
  for (const mock of mocksForServer) {
花裤衩's avatar
花裤衩 committed
16 17 18
    app[mock.type](mock.url, mock.response)
    mockLastIndex = app._router.stack.length
  }
19
  const mockRoutesLength = Object.keys(mocksForServer).length
花裤衩's avatar
花裤衩 committed
20 21 22 23 24 25 26 27 28 29 30 31 32 33
  return {
    mockRoutesLength: mockRoutesLength,
    mockStartIndex: mockLastIndex - mockRoutesLength
  }
}

function unregisterRoutes() {
  Object.keys(require.cache).forEach(i => {
    if (i.includes(mockDir)) {
      delete require.cache[require.resolve(i)]
    }
  })
}

34 35 36 37 38 39 40 41 42 43 44 45
// for mock server
const responseFake = (url, type, respond) => {
  return {
    url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`),
    type: type || 'get',
    response(req, res) {
      console.log('request invoke:' + req.path)
      res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond))
    }
  }
}

花裤衩's avatar
花裤衩 committed
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
module.exports = app => {
  // parse app.body
  // https://expressjs.com/en/4x/api.html#req.body
  app.use(bodyParser.json())
  app.use(bodyParser.urlencoded({
    extended: true
  }))

  const mockRoutes = registerRoutes(app)
  var mockRoutesLength = mockRoutes.mockRoutesLength
  var mockStartIndex = mockRoutes.mockStartIndex

  // watch files, hot reload mock server
  chokidar.watch(mockDir, {
    ignored: /mock-server/,
    ignoreInitial: true
  }).on('all', (event, path) => {
    if (event === 'change' || event === 'add') {
Pan's avatar
Pan committed
64 65 66
      try {
        // remove mock routes stack
        app._router.stack.splice(mockStartIndex, mockRoutesLength)
花裤衩's avatar
花裤衩 committed
67

Pan's avatar
Pan committed
68 69
        // clear routes cache
        unregisterRoutes()
花裤衩's avatar
花裤衩 committed
70

Pan's avatar
Pan committed
71 72 73
        const mockRoutes = registerRoutes(app)
        mockRoutesLength = mockRoutes.mockRoutesLength
        mockStartIndex = mockRoutes.mockStartIndex
花裤衩's avatar
花裤衩 committed
74

Pan's avatar
Pan committed
75 76 77 78
        console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed  ${path}`))
      } catch (error) {
        console.log(chalk.redBright(error))
      }
花裤衩's avatar
花裤衩 committed
79 80 81
    }
  })
}