当前位置: 首页 > 后端技术 > Node.js

我的模拟服务器——喵喵Mock

时间:2023-04-03 22:55:31 Node.js

利用业余时间搭建了一个基于Node.js的模拟服务器,一款自娱自乐的产品。功能比较简单,非常非常非常新手,但是可以满足大部分需求。MeowMock源码的价值在于方便自测:创建虚拟对象来替代不确定或不易构建的真实对象。避免等待:前端和服务端的开发进度往往不同步。前端可以根据协议使用MockServer模拟假接口,不受服务器进度的束缚。代替接口文档:接口文档可以按业务类型划分,文档内容可以呈现在前台,方便参考。功能请求类型支持GET、POST。其中,GET请求返回的列表数据支持分页,可选两组参数:page+count、start_num+count,具体区别后面会说明。数据类型支持数值、布尔值、字符串、图像、富文本、字典和列表。所有数据都可以动态生成,但仍然支持定义为固定值。启动方式cdmeow-mocknpminstallnpmrunstart默认端口号为8888,可以在/bin/www文件中修改:varport=normalizePort(process.env.PORT||'8888');如果未安装Node.js,请移至此处下载并安装。如果没有安装npm,请先执行:curl-Lhttps://npmjs.com/install.sh|sh使用方法在/data文件夹下创建一个.js接口文件,比如example.js。打开route.js并添加以下代码:varexample=require('./data/example');varrequestGatherLst=[例子];可以理解为刚才创建的接口文件是在服务中注册的。我们可以创建多个接口文件module1.js、module2.jd、module3.js……假设example.js的代码如下:vartype=require('../type');module.exports={example1:{url:'/example1/_data',type:'GET',data:function(){return{}}},example2:{url:'/example2/_data',type:'POST',data:function(){return{}}}}显然需要定义各个接口的url和类型,而返回数据的关键在于数据回调函数的返回值。举个栗子:所有数据都可以动态生成example1:{url:'/example1/_data',type:'GET',data:function(){return{message:'请求成功',error:0,data:{id:type.id(),//返回idnumber:type.number({//返回值min:288,max:999}),bool:type.bool(),//返回布尔值string1:type.string([//返回字符串'copywritingone','copywritingtwo','copywritingthree']),string2:type.string({//returnstringsminL:5,maxL:16}),image1:type.image([//返回图片链接'http://oij8a9ql4.bkt.clouddn.com/default-fe.jpg','http://osm0bpix4.bkt.clouddn.com/thumb.jpg']),image2:type.image({//返回图片链接类型:'-thumb'}),list1:type.list({//返回列表长度:5,data:function(){returntype.number()}}),list2:type.list({//返回列表长度: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=这个;varcurtime=(newDate()).valueOf();varrecursion=function(key){if(_this.timestamps[key]){vartmp=recursion(key+1);}else{_this.timestamps[key]=1;返回键;}返回tmp;};返回递归(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/example...查看返回的数据如下:由于数据是动态生成的,你看到的结果可能和我的不一样~不过在重启服务之前,同一个url下,刷新一下浏览器控制器不会影响返回的数据,除非更改参数值或添加新参数。打开http://localhost:8888/example...体验一下!然后打开http://localhost:8888/example...体验一下吧!列表类型特殊说明列表项索引在渲染列表数据时,往往需要渲染其序号,例如leaderboard:index配置项就是为以上需求而诞生的:index:{name:'idx',format:'\d',type:'int'}index.name->指定名称,默认值为index。index.format->指定格式,目前支持:d、0d、00d,默认值为d。index.type->指定变量类型,目前支持:int、string,默认值取决于索引格式。关于format格式:索引值为1,2,3,4,...(默认变量类型为int)0d格式:索引值为01,02,03,...10,11,...(仅限变量类型withstring)00d格式:索引值为001,002,...010,011,...099,100,101,...(变量类型仅为string)具体效果如下:注意数据配置项推荐:list:type.list({length:5,data:function(){returntype.number()}})returnslistvaluesaredifferent:notrecommended: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配置项决定了返回数据中哪个字段是待切分的列表,默认值为data。两组分页参数page+count若数据总长度为36,每页若数据长度count=10,则:当page=1时,返回第1~10条数据;page=2时,返回第11~20条数据;page=3时,返回第21~30条数据;page=4,返回第31到36条数据;当页面>4时,返回一个空列表。打开http://localhost:8888/example...体验一下!start_num+count截取列表中start_num+1到start_num+count的数据。如果?start_num=6&count=5,则返回第7到11条数据。打开http://localhost:8888/example...体验一下!备注:没有分页参数时,默认返回所有数据。当没有count参数时,默认返回10条数据。作者:连小淼我的后花园:https://sunmengyuan.github.io...我的github:https://github.com/sunmengyuan