从0开发一个假数据服务器

现在开发都是前后端分离,在后端接口没有出来之前,使用假数据mock能提高开发效率。现在执行假数据的方法有很多,如mock.js, easymock,json-server。因为接触了node.js,能够捕捉请求并返回数据,所以我尝试给自己写一个简单的假数据服务器。(完整代码

用express去尝试做一个吧。

第一步,翻了下express文档,先看下它如何简单处理请求:

1
2
3
4
5
6
7
8
9
10
// 匹配 /about 路径的请求 see: http://www.expressjs.com.cn/starter/basic-routing.html
// 对网站首页的访问返回 "Hello World!" 字样
app.get('/', function (req, res) {
res.send('Hello World!');
});

// 网站首页接受 POST 请求
app.post('/', function (req, res) {
res.send('Got a POST request');
});

那我要处理一个地址是 /api/services/app/User/GetUsersList, 请求方式是get或者post 这样的请求,照此类推就是

1
2
3
4
5
6
app.get('/api/services/app/User/GetUsersList', function (req, res) {
res.send('data');
});
app.post('/api/services/app/User/GetUsersList', function (req, res) {
res.send('data');
});

要处理的假数据请求肯定很多,不可能一个个这样写上去,要构造一个方法,批量处理

1
2
3
app[method](url, (req, res) => {

});

第二步,因为处理的请求很多,每个请求都有自己的请求方式还有返回的数据,把每个请求定义为一个对象,具有各自的属性:

1
2
3
4
url:            请求地址
method: 请求方式
body: 返回的内容
callbackData: 根据请求的字段,对数据再进行个性化加工的函数

编写其中一个user.js文件,把每一个请求对象添加到exports上面

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
/*
* user.js
*/
exports.getUsersList = {
url: '/api/services/app/User/GetUsersList',
method: 'get',
body: {
data:{
totalPage: 100,
usersList: [{
id: 1,
number: '0123',
name: '王小虎',
phone: '13589980898'
}]
},
message:'获取用户信息成功',
success:true,
error:null
},
callbackData(data, req, res) {
let _data = data,
//执行一些操作
return _data;
}
};

exports.getUsersItem ......

第三步,好的,于是我就构想了下文件目录结构,这样能够模块化处理请求对象

1
2
3
4
5
6
7
8
- mockJson
- index.js //把该目录下的请求模块(user,manage,goods)的请求对象都导出到index的exports里
- user.js
- manage.js
- goods.js
......

- server.js //启动服务器的主函数

在mockJson的index.js所做的事情就是读取该目录下除了index.js的以外的模块,并把这些模块的请求对象统一添加到index的exports对象里,这里用node去读取该文件夹的内容,统一处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
let fs = require('fs');
let fileArr = fs.readdirSync(__dirname),
newArr = [];

/**
* 读取mockJson目录下除了index以为的文件名
*/
fileArr.forEach((item) => {//fileArr : ['user', 'manage', 'goods']
if (!/index/.test(item)) {
newArr.push(item.match(/(\w+)\./)[1]);
}
});

/**
* 引入文件,并把各个模块(user, manage等)的请求对象赋值给exports对象
*/
newArr.forEach((filename) => {
let file = require('./' + filename);
Object.assign(exports, file);
});

最后一步,server.js 读取mockJson的index模块,批量构造请求

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

//.....
let mockJson = require('./mockJson');

//....

// 构造请求
for (let key in mockJson) {
if (mockJson.hasOwnProperty(key)) {
let element = mockJson[key];
let method = element.method,
url = element.url,
body = element.body;
app[method](url, (req, res) => {
console.log(`url${url}`);
//如果定义回调函数
if (element.callbackData) {
let newData = element.callbackData(body, req, res);
res.send(JSON.stringify(newData));
} else {
res.send(JSON.stringify(body));
}
});
}
}
//....

对于分页处理或者根据不同的字段返回不同数据,可以在callbackData这个函数搞定。
好了,一个简单的假数据服务器完成了。
下载代码运行一下,然后在浏览器输入http://localhost:5000/api/services/app/User/GetUsersList
会看到: