Skip to content

Commit

Permalink
修复 mock server 热更新时路由错乱的问题
Browse files Browse the repository at this point in the history
  • Loading branch information
puer committed Jul 6, 2020
1 parent ea60478 commit 7f036a6
Showing 1 changed file with 20 additions and 29 deletions.
49 changes: 20 additions & 29 deletions mock/mock-server.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,10 @@ const bodyParser = require('body-parser')
const chalk = require('chalk')
const path = require('path')
const Mock = require('mockjs')
const express = require('express')

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

function registerRoutes(app) {
let mockLastIndex
const { mocks } = require('./index.js')
const mocksForServer = mocks.map(route => {
return responseFake(route.url, route.type, route.response)
})
for (const mock of mocksForServer) {
app[mock.type](mock.url, mock.response)
mockLastIndex = app._router.stack.length
}
const mockRoutesLength = Object.keys(mocksForServer).length
return {
mockRoutesLength: mockRoutesLength,
mockStartIndex: mockLastIndex - mockRoutesLength
}
}

function unregisterRoutes() {
Object.keys(require.cache).forEach(i => {
if (i.includes(mockDir)) {
Expand All @@ -34,7 +18,7 @@ function unregisterRoutes() {
// for mock server
const responseFake = (url, type, respond) => {
return {
url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`),
url: new RegExp(url),
type: type || 'get',
response(req, res) {
console.log('request invoke:' + req.path)
Expand All @@ -43,6 +27,19 @@ const responseFake = (url, type, respond) => {
}
}

let mockRouter
function setupMocks(app) {
mockRouter = new express.Router()
const { mocks } = require('./index.js')
const mocksForServer = mocks.map(route => {
return responseFake(route.url, route.type, route.response)
})
for (const mock of mocksForServer) {
mockRouter[mock.type](mock.url, mock.response)
}

}

module.exports = app => {
// parse app.body
// https://expressjs.com/en/4x/api.html#req.body
Expand All @@ -51,9 +48,10 @@ module.exports = app => {
extended: true
}))

const mockRoutes = registerRoutes(app)
var mockRoutesLength = mockRoutes.mockRoutesLength
var mockStartIndex = mockRoutes.mockStartIndex
setupMocks(app)
app.use(process.env.VUE_APP_BASE_API, function replacableRouter(req, res, next) {
mockRouter(req, res, next)
})

// watch files, hot reload mock server
chokidar.watch(mockDir, {
Expand All @@ -62,15 +60,8 @@ module.exports = app => {
}).on('all', (event, path) => {
if (event === 'change' || event === 'add') {
try {
// remove mock routes stack
app._router.stack.splice(mockStartIndex, mockRoutesLength)

// clear routes cache
unregisterRoutes()

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

console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`))
} catch (error) {
Expand Down

0 comments on commit 7f036a6

Please sign in to comment.