文章

Json server && mockjs服务

Json-server & mockjs 搭建mock数据服务器

项目目录

.
|-- json-server.json
|-- mockDB
|   |-- db.json
|   `-- testdb.js
|-- modules.js
|-- package.json
`-- server.js

1. 依赖

npm i json-server mockjs

2. 创建mock模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const Mock = require("mockjs");
const Random = Mock.Random;

const plan = () => {
  return Mock.mock({
    code: 200,
    succ: true,
    msg: 'ok',
    data: {
      'list|6-12': [
        {
          "id|+1": 1,
          "boyScore|1-100": 1,
          "girlScore|1-100": 1,
        }
      ],
    }
  });
}

module.exports = {
  plan,
}

3. 组合mock模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 // 引入mockDB文件夹下的文件,假如有以下文件
 const testdata = require('./mockDB/testdb');
 
 // 这里定义一个收集的对象
const DB = {
  dbFunc: {},
  dbJson: {},
}
// 收集mock函数,在server.js会用到
DB.dbFunc = { ...testdata };

// 获取所有的api路径
const apiPath = Object.keys(DB.dbFunc);

// 组装json-server需要的路由表,这里为什么都是空对象呢?
// 上面说过,路由表的value必须是对象或者数组。但我们的mockDB文件夹下定义的都是mock函数,所以这里要保证路由表是正确的,就要重新组装一份符合格式的路由表。
apiPath.forEach(item => {
  DB.dbJson[item] = {};
});

module.exports = {
  ...DB
}

4. 设置服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const port = 9000;
const jsonServer = require('json-server');
// 创建json-server实例
const server = jsonServer.create();
const {dbFunc, dbJson} = require('./modules');
// 将路由配置表传入,生成路由表
const router = jsonServer.router(dbJson);
const middlewares = jsonServer.defaults();

// 这里比较重要。
// 目的是:重新定义路由返回的数据。就是说:每访问一个路由,返回response的时候,都可以经过router.render重新定义response数据
// 因为我们在db.js里将mock函数收集到了dbFunc对象里。
router.render = (req, res) => {
  // 根据请求的url,截取路径。
  // 例如:一般情况,res.url是/user_info?id=1234这样的格式。
  const end = req.url.indexOf('?');
  const apiName = end === -1 ? req.url.slice(1) : req.url.slice(1, end + 1);
  // 根据apiName拿到对应的mock函数,然后返回mock函数生产的mock数据
  // 因为每次返回response的时候,都会执行一次该函数,所以得到的都是新的mock数据
  const response = dbFunc[apiName] && dbFunc[apiName]();
  res.send(response || {});
};

server.use(middlewares);
// 导入路由
server.use(router);
// 在port端口开服务
server.listen(port, () => {
  console.log(`JSON Server is running at http://localhost:${port}`);
});

引用

json-server + mock.js搭建前后端分离的mock服务

本文由作者按照 CC BY 4.0 进行授权