From 7f036a6e340235faaf157ce71a51b5f8b4abe0c3 Mon Sep 17 00:00:00 2001
From: puer <alter001@163.com>
Date: Mon, 6 Jul 2020 01:56:56 +0000
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20mock=20server=20=E7=83=AD?=
 =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=97=B6=E8=B7=AF=E7=94=B1=E9=94=99=E4=B9=B1?=
 =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 mock/mock-server.js | 49 ++++++++++++++++++---------------------------
 1 file changed, 20 insertions(+), 29 deletions(-)

diff --git a/mock/mock-server.js b/mock/mock-server.js
index 8941ec0f..d033cc08 100644
--- a/mock/mock-server.js
+++ b/mock/mock-server.js
@@ -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)) {
@@ -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)
@@ -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
@@ -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, {
@@ -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) {