30行核心代码 在项目中集成mock

245 阅读3分钟

在devServer添加如下代码

利用before在本地中运行

官网中介绍

提供在服务器内部先于所有其他中间件执行自定义中间件的功能。这可以用于定义自定义处理程序,例如:

before(app){
  app.get('/some/path', function(req, res) {
    res.json({ custom: 'response' });
  });
}

我们把他抽离到单独的文件

 devServer: {
      .....
    before:function (app) {
      require("./../mock/index.js")(app)
    }
  },

建文件写json

目录结构大概如下

├── build
├── config
├── mock
│   ├── data
│   │   └── info.json
│   ├── index.js
│   └── mockData
│       ├── ageSegDef
│       │   ├── init.json
│       │   └── listPage.json
│       ├── getBatchAppList
│       │   └── index.json
│       ├── gmis
│       │   ├── assessment
│       │   │   └── web
│       │   │       └── batchApp
│       │   │           ├── getBatchAppList.json
│       │   │           └── getBatchDefList.json
│       │   └── upms
│       │       └── web
│       │           └── login
│       │               └── listAllDepts.json
│       ├── index.json
│       ├── list
│       │   ├── listData.json
│       │   └── nav
│       │       └── navlist.json
│       ├── loginout
│       │   └── loginout.json
│       └── selectMeans
│           ├── list.json
│           └── save.json
├── package-lock.json
├── package.json
├── src
└── static

内容大概如下

你想要返回的json

{
  "code": "0",
  "msg": "success",
  "data": {
    "text":"listData"
  },
  "redirectUrl": null
}

读取文件

文件建好后利用node中的fs模块读取文件 创建一个对象然后以key为路径文件内容为value的格式存储 如下

var routerList;
var urlib = require("url");
var fs = require('fs');
var base = __dirname + "/mockData";
function readFile (base, obj) {
  var jsonData = obj, files;
  files = fs.readdirSync(base)
  files.forEach(file => {
    var fileData = fs.statSync(base + "/" + file)
    //判断是否为文件夹
    if (fileData.isDirectory()) {
      readFile(base + "/" + file, jsonData)
    } else {
      //读取文件种的内容
      var data = fs.readFileSync(base + "/" + file, 'utf-8').toString();
      //key 路径
      //data 文件内容
      //存储在对象中
      jsonData[base + "/" + file] = {
        data: data
      }
    }
  })
  return jsonData
}

生成接口

利用Object.entries的方法把对象转换为二维数组

//对象专数组
routerList = Object.entries(readFile(base, {}))
module.exports = function (app) {
    // app == express
    // 遍历生成接口
  routerList.forEach(item => {
    let routerUrl = item[0].replace(base, "").replace(".json", "")
    // 筛选需要逻辑交互的接口  
    switch (routerUrl) {
      //选择
      case '/selectMeans/q':
        {
          app.get(routerUrl, (req, res) => {
            var myobj = urlib.parse(req.url, true);
            var pageNum = myobj.query.pageNum;
            var pageSize = myobj.query.pageSize;
            var resData = JSON.parse(item[1].data).dataObject.meanslist.splice((pageNum - 1) * 10, pageSize);
            var newData = {
              "code": "SUCCESS",
              "dataObject": {
                "meanslist": resData,
                totalCount: JSON.parse(item[1].data).dataObject.meanslist.length
              },
              "message": "操作成功",
            };
            res.send(newData)
          })
        }
        break;
      
      default:
        {
          // 无交互直接返回文件中所取数据 
          app.get(routerUrl, (req, res) => {
            res.send(JSON.parse(item[1].data))
          })
        }
        break;
    }
  })
  //登陆的接口
  app.get('/login', (req, res) => {
    var myobj = urlib.parse(req.url, true);
    var userCode = myobj.query.userCode;
    var userKey = myobj.query.userKey;
    if (userCode == 'admin' && userKey == '1q2w3e4r') {
      res.send(data)
      return false
    }
    res.send({
      "code": "ERR",
      'token': '啦啦啦',
      "message": "账号或者密码不正确",
    })
  })
}

完整代码

var routerList;
var fs = require('fs');
var urlib = require("url");
var base = __dirname + "/mockData";
var data = require("./data/info.json");
//readFile 读取文件获取文件的路径和文件种的内容
function readFile (base, obj) {
  var jsonData = obj, files;
  files = fs.readdirSync(base)
  files.forEach(file => {
    var fileData = fs.statSync(base + "/" + file)
    //判断是否为文件夹
    if (fileData.isDirectory()) {
      readFile(base + "/" + file, jsonData)
    } else {
      //读取文件种的内容
      var data = fs.readFileSync(base + "/" + file, 'utf-8').toString();
      //key 路径
      //data 文件内容
      //存储在对象中
      jsonData[base + "/" + file] = {
        data: data
      }
    }
  })
  return jsonData
}
//对象专数组
routerList = Object.entries(readFile(base, {}))
module.exports = function (app) {
    // app == express
    //遍历生成接口
  routerList.forEach(item => {
    let routerUrl = item[0].replace(base, "").replace(".json", "")
    // 筛选需要逻辑交互的接口
    switch (routerUrl) {
      case '/ageSegDef/q':
        {
          app.get(routerUrl, (req, res) => {
            var myobj = urlib.parse(req.url, true);
            var pageNum = myobj.query.pageNum;
            var pageSize = myobj.query.pageSize;
            var resData = JSON.parse(item[1].data).dataObject.meanslist.splice((pageNum - 1) * 10, pageSize);
            var newData = {
              "code": "SUCCESS",
              "data": {
                "dataList": resData,
                totalCount: JSON.parse(item[1].data).dataObject.meanslist.length
              },
              "message": "操作成功",
            };
            res.send(newData)
          })
        }
        break;
      default:
        {
            // 无交互直接返回文件中所取数据 
          app.get(routerUrl, (req, res) => {
            res.send(JSON.parse(item[1].data))
          })
        }
        break;
    }
  })
  //登陆的接口
  app.get('/login', (req, res) => {
    var myobj = urlib.parse(req.url, true);
    var userCode = myobj.query.userCode;
    var userKey = myobj.query.userKey;
    if (userCode == 'admin' && userKey == '1q2w3e4r') {
      res.send(data)
      return false
    }
    res.send({
      "code": "ERR",
      'token': '啦啦啦',
      "message": "账号或者密码不正确",
    })
  })
}