我的 Mock Server - Meow Mock

业余时间基于 Node.js 搭建了 Mock Server 一枚,自娱自乐的产物。功能较简易,非常非常非常小白级,但可满足绝大多需求。

Meow Mock 源码

价值
  • 便于自测:创建虚拟对象代替具备不确定性或不易构造的真实对象。

  • 避免等待:前端与服务端的开发进度往往不同步。前端可使用 Mock Server 根据约定仿制假接口以不受服务端进度的约束。

  • 代替接口文档:接口文件可按业务类型划分,文档内容可渲染于前台方便查阅。

特性
  • 请求类型支持 GET、POST。其中 GET 请求返回列表数据 支持分页,两套参数可选:page + count、start_num + count,具体差别稍后阐述。

  • 数据类型支持数值、布尔值、字符串、图片、富文本、字典、列表。所有数据均可 动态生成,但仍支持定义为固定值。


启动方式
cd meow-mock
npm install
npm run start

默认端口号 8888,可在 /bin/www 文件中修改:

var port = normalizePort(process.env.PORT || '8888');

未安装 Node.js 的请先移驾此处下载并安装。

未安装 Npm 的请先执行:

curl -L https://npmjs.com/install.sh | sh

使用方法

/data 文件夹内创建 .js 接口文件,例如 example.js。打开 route.js 添加如下代码:

var example = require('./data/example');
var requestGatherLst = [
    example
];

可理解为在该服务中注册了刚刚创建的接口文件。我们可以创建多个接口文件 module1.js、module2.jd、module3.js...

假定 example.js 代码如下:

var type = require('../type');
module.exports = {
    example1: {
        url: '/example1/_data',
        type: 'GET',
        data: function () {
            return {}
        }
    },
    example2: {
        url: '/example2/_data',
        type: 'POST',
        data: function () {
            return {}
        }
    }
}

显然,需要定义每一接口的 urltype,返回数据的讲究在于 data 回调函数的返回值。

举个板栗:

所有数据均可动态生成

example1: {
    url: '/example1/_data',
    type: 'GET',
    data: function () {
        return {
            message: '请求成功',
            error: 0,
            data: {
                id: type.id(), // 返回 id
                number: type.number({ // 返回数值
                    min: 288,
                    max: 999
                }),
                bool: type.bool(), // 返回布尔值
                string1: type.string([ // 返回字符串
                    '文案一',
                    '文案二',
                    '文案三'
                ]),
                string2: type.string({ // 返回字符串
                    minL: 5,
                    maxL: 16
                }),
                image1: type.image([ // 返回图片链接
                    'http://oij8a9ql4.bkt.clouddn.com/default-fe.jpg',
                    'http://osm0bpix4.bkt.clouddn.com/thumb.jpg'
                ]),
                image2: type.image({ // 返回图片链接
                    type: '-thumb'
                }),
                list1: type.list({ // 返回列表
                    length: 5,
                    data: function () {
                        return type.number()
                    }
                }),
                list2: type.list({ // 返回列表
                    length: 22,
                    index: {
                        name: 'idx',
                        format: '0\d'
                    },
                    data: function () {
                        return {
                            pro1: type.number(),
                            pro2: type.string()
                        }
                    }
                })
            }
        }
    }
}
  • id -> 返回 id,为避免重复使用时间戳。

此处有坑!假定一列表长度为 n,列表项含字段 id。生成每一列表项的时间差非常非常非常小,那么:

id 怎么可以重复...想办法去重喽~

module.exports = {
    timestamps: {},
    id: function () {
        var _this = this;
        var curtime = (new Date()).valueOf();
        var recursion = function (key) {
            if (_this.timestamps[key]) {
                var tmp = recursion(key + 1);
            } else {
                _this.timestamps[key] = 1;
                return key;
            }
            return tmp;
        };
        return recursion(curtime);
    }
}
  • number -> 返回数值,可使用 min、max 配置项规定其取值范围,默认范围 1 ~ 11。

  • bool -> 返回布尔值。

  • string1 -> 返回字符串,可从配置列表中随机选取一值。

  • string2 -> 返回字符串,可使用 minL、maxL 配置项规定其长度范围,默认范围 1 ~ 11。

  • image1 -> 返回图片链接,可从配置列表中随机选取一值。

  • image2 -> 返回图片链接,可使用 type 配置项规定图片尺寸,目前支持:640 * 307(-w)、320 * 320(-half)、120 * 120(-thumb),默认值为 -half。

  • list1 -> 返回列表,可使用 length 配置项规定其长度,默认长度为 0。

  • list2 -> 返回列表,可使用 length 配置项规定其长度,默认长度为 0。

打开 http://localhost:8888/example1/_data 查看返回数据如下:

由于数据是 动态生成 的,你所看到的结果可能与我的不同嗷~

但在重启服务之前,同一 URL 下,刷新浏览器是不会影响返回数据的,除非改变参数值或添加新的参数。

打开 http://localhost:8888/example1/_data?a=1 体会下!

再打开 http://localhost:8888/example1/_data?a=2 体会下!


List 类型特殊说明

列表项 index

渲染列表数据时,往往需要渲染其序号,例如排行榜:

index 配置项便是为上述需求而生:

index: {
    name: 'idx',
    format: '\d',
    type: 'int'
}
  • index.name -> 规定命名,默认值为 index。

  • index.format -> 规定格式,目前支持:\d、0\d、00\d,默认值为 \d。

  • index.type -> 规定变量类型,目前支持:int、string,默认值取决于 index 格式。

关于 format

  • \d 格式:index 值为 1, 2, 3, 4, ...(默认变量类型 int)

  • 0\d 格式:index 值为 01, 02, 03, ... 10, 11, ...(变量类型仅有 string)

  • 00\d 格式:index 值为 001, 002, ... 010, 011, ... 099, 100, 101, ...(变量类型仅有 string)

具体效果形如:

注意 data 配置项写法

推荐:

list: type.list({
    length: 5,
    data: function() {
        return type.number()
    }
})

返回列表值不同:

不推荐:

list: type.list({
    length: 5,
    data: type.number()
})

返回列表值相同:

多数情况我们不喜欢这样的结果~


GET 请求列表数据分页

首先说明列表数据请求接口对象写法:

example2: {
    url: '/example2/_data',
    type: 'GET',
    list_name: 'items',
    data: function () {
        return {
            message: '请求成功',
            error: 0,
            items: type.list({
                length: 36,
                index: {
                    name: 'idx',
                    format: '0\d'
                },
                data: function () {
                    return {
                        id: type.id(),
                        number: type.number(),
                        string: type.string(),
                        image: type.image()
                    }
                }
            })
        }
    }
}

list_name 配置项决定了返回数据中究竟哪个字段是待分段的 list,其默认值为 data。

两套分页参数

page + count

假如数据总长 36,每一分页数据长度 count=10,那么:

page=1 时,返回第 1 ~ 10 条数据;

page=2 时,返回第 11 ~ 20 条数据;

page=3 时,返回第 21 ~ 30 条数据;

page=4 时,返回第 31 ~ 36 条数据;

page > 4 时,返回空列表。

打开 http://localhost:8888/example2/_data?page=1&count=10 体会下!

start_num + count

截取列表中第 start_num + 1start_num + count 条数据。假如 ?start_num=6&count=5,那么返回第 7 ~ 11 条数据。

打开 http://localhost:8888/example2/_data?start_num=6&count=5 体会下!

备注:

  • 无分页参数时默认返回所有数据。

  • 无 count 参数时默认返回 10 条数据。


作者:呆恋小喵

我的后花园:https://sunmengyuan.github.io/garden/

我的 github:https://github.com/sunmengyuan

原文链接:https://sunmengyuan.github.io/garden/2017/09/15/meow-mock.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,548评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,497评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,990评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,618评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,618评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,246评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,819评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,725评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,268评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,356评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,488评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,181评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,862评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,331评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,445评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,897评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,500评论 2 359

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,696评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,847评论 6 342
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,661评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,280评论 25 707
  • 情景重现 涵涵今年6岁了,有一天涵涵妈妈去幼儿园接他,老师说他在幼儿园里把一个小朋友的胳膊给咬了一口。 回到家,涵...
    漫界阅读 583评论 0 0