使用nodejs搭建api的mock服务
1. 介绍
公司的业务开发都是静态页面,开发前期总是避免不了获取api的问题。在vue中有一些mockjs的方案,方案都是注入性质的,和最终部署总是有差别,而且业务大部分还在zepto下,很难找到合适的方案。而开发前期调整css样式需要真实的dom,不能总是写个静态页面来调试。正好利用koa2的便利性,搭建一个mock服务。
在线的mock服务其实还是不少的,大部分都是以 url路径作区分API的名字,对于普通的API是够用了,但对于根据输入参数作为API名称的情况,就没有办法了。比如我们公司的API:
@url
/api @params
{
func: "myapi",
params: '{"name": "3333"}'
}
这种奇特的API根本就没法用普通的mock实现好么。。。
所以自己开发了一套mock服务,github地址:https://github.com/wenlonghuo/xmocker-cli 。 也可以通过npm进行安装: npm i -g xmocker-cli。预览界面地址:http://xmocker.wlhot.top/#/about
设计的目标为:
1. 本地随意修改,不影响其他人
2. 能开个代理,当本地数据不足,把API请求转发到其他服务器上
3. 安装要方便,界面化操作。
2 实现
框架使用koa2进行开发,使用babel转换代码便于支持nodejs 6 的版本。本地化数据库,只要一个npm安装就直接使用。
整体结构为:
项目 -> API基础信息 -> API分支
添加项目、API后,可在界面上操作进行启动,重启等,同时还提供命令式启动文件服务器。
2.1 结构
项目:名称,路径,端口,代理
API基础信息: 名称,方法,URL,二级路径,二级路径对应值
API分支:名称,判断条件,数据
2.2 实现不同API的区分
将koa的middleware注册到所有的router上,使用koa-bodyparse获取post相关数据,整合所有的输入参数:
Object.assign({}, ctx.params, ctx.query || {}, ctx.request.body)
然后遍历api基础信息列表,判断指定的键值是否和预定的值相等,获得请求所属的API
2.3 对API进行二级区分
要实现更加灵活的数据返回,只能添加自定义的函数了。在API配置中添加判断条件,通过 new Function形式生成函数,根据返回值判断,如果不为真,则检测下一分支,否则认定当前分支是目标值,取得mock数据,请求返回
2.4 代理的实现
实现代理使用http-proxy模块。为方便使用,需要两种形式的代理: 指定api路径代理至服务器和未找到api时代理至服务器。前者很简单,使用koa-router直接注册添加中间件就好,后者需要利用koa的洋葱圈模型,在请求结束后判断http status为404,再代理至指定服务器
2.5 开启文件服务器
光有API服务不行,毕竟我开发的是静态页面,总归要个文件服务,便于边写边调。使用koa-send模块实现文件服务,利用npm link或者npm install会在全局注册命令,方便的开启文件服务。
2.6 界面服务
利用框架快速开发,使用iview框架,vue-cli生成脚手架,build生成dist文件,使用文件服务,监听6001端口,浏览器访问就可以控制服务了。

预览界面参见:http://xmocker.wlhot.top/#/about
3 使用
利用npm link就能注册全局命令,简单的mocker start就能启动服务啦。当然,后续又加了一些实用的功能,稳定性之类的还有待优化,至少在开发速度上的提升还是比较大的。鉴于公司还不写测试用例,写完页面就算结束,这套API服务已经成为我们公司前端开发必用工具,至少mac和windows都能正常运行,也算没白花时间写了(反正只是练手
)。欢迎使用这套工具,有什么问题可以在github上提issue,有互动才有更新的动力。
使用nodejs搭建api的mock服务的更多相关文章
- 用nodejs搭建一个简单的服务监听程序
作为一个从业三年左右的,并且从事过半年左右PHP开发工作的前端,对于后台,尤其是对以js语言进行开发的nodejs,那是比较有兴趣的,虽然本身并没有接触过相关的工作,只是自己私下做的一下小实验,但是还 ...
- nodejs搭建简单的websocket服务端
创建websocket服务端使用了nodejs-websocket ,首先要安装nodejs-websocket,在项目的目录下: npm install nodejs-websocket 1.搭建w ...
- nodejs搭建简易的rpc服务
这里主要使用的是jayson包,使用jayson实现rpc server端十分简单,如下: var jayson = require('jayson') // create a server var ...
- 使用node.js + json-server + mock.js 搭建本地开发mock数据服务
在开发过程中,前后端不论是否分离,接口多半是滞后于页面开发的.所以建立一个REST风格的API接口,给前端页面提供虚拟的数据,是非常有必要的.对比过多种mock工具后,我最终选择了使用 json se ...
- 在vue中使用express-mock搭建mock服务
首先安装 nodemon ,如果是全局安装,那么所有的项目都可以使用mock服务 npm install nodemon 再安装express-mockjs npm i -D express-mock ...
- nodejs搭建web服务教程
nodejs搭建web服务教程 先安装nodejs 然后 命令node js文件 即可开启服务了 输出如下 Magic happens on port 9011 你查看端口可以看到tcp 0 0 :: ...
- nodejs anywhere 搭建本地静态文件服务
一.背景 工作中有时候往往会遇到下述场景:例如需要将新打好的安装包等文件临时性的给到同事,可能还需要给到多个同事.这时,我们往往有如下几种方案: 1,一般都会有公司内部的文件系统,上传文件后将对应的地 ...
- 在django中如何从零开始搭建一个mock服务
mock概念 mock 就是模拟接口返回的一系列数据,用自定义的数据替换接口实际需要返回的数据,通过自定义的数据来实现对下级接口模块的测试.这里分为两类测试:一类是前端对接口的mock,一类是后端单元 ...
- 浅入深出Vue:工具准备之PostMan安装配置及Mock服务配置
浅入深出Vue之工具准备(二):PostMan安装配置 由于家中有事,文章没顾得上.在此说声抱歉,这是工具准备的最后一章. 接下来就是开始环境搭建了~尽情期待 工欲善其事必先利其器,让我们先做好准备工 ...
随机推荐
- 【js 实践】js 实现木桶布局
还有两个月左右就要准备实习了,所以特意练一练,今天终于搞定了js 的木桶布局了 这一个是按照一个插件的规格去写的以防以后工作需要,详细的解释在前端网这里 http://www.qdfuns.com/n ...
- YAML书写规范
1. 认识 YAML YAML是一个类似 XML.JSON 的标记性语言.YAML 强调以数据为中心,并不是以标识语言为重点.因而 YAML 本身的定义比较简单,号称"一种人性化的数据格式语 ...
- Android_基础控件
目录 一.文本控件TextView 二.按钮控件Button 三.图片控件ImageView 四.输入控件EditText 一.文本控件TextView 1.布局文件 <TextView and ...
- RocketMQ-Tomcat中部署rocketmq-console
1. https://github.com/didapinchegit/rocket-console 在github上下载rocketmq-consoler的源码, 用mvn clean packag ...
- Windows 性能搜集【perfmon】
为方便问题发生后,问题原因的分析排查,我们可以在服务器中事先开启logman功能搜集服务器的性能数据,方便故障发生后,问题原因的分析排查 Windows服务器部署Permon性能搜集器: 1.使用管理 ...
- Linux 性能搜集【top/vmstat/iostat】
为方便问题发生后,问题原因的分析排查,我们可以在服务器中事先部署如下脚本,方便故障发生后,问题原因的分析排查 脚本部署方法: 1.将脚本[top_monitor.sh]上传到服务器 2.登陆虚拟机,并 ...
- Python初识-day1
1.第一个python程序(在pycharm中运行的,感觉还不错) 注释: 当行注释:#被注释内容 多行注释:''' 被注释内容 ''' 2.变量 (1) 自己理解的定义(仅供参考): 为了存储数据 ...
- 苹果系统css样式变化
原因:苹果自带样式覆盖了 参考文章比较详细,就不自己写了,copy了一份~~~ @参考文章 只要在样式里面加一句去掉css去掉iPhone.iPad的默认按钮样式就可以了!~ input[type=& ...
- 如何使用 volatile, synchronized, final 进行线程间通信
原文地址:https://segmentfault.com/a/1190000004487149.感谢作者的无私分享. 你是否真正理解并会用volatile, synchronized, final进 ...
- Jquery实现选项卡效果
<script type="text/javascript"> $(document).ready(function(){ $('.ct:gt(0)').hide(); ...