5分钟教你用nodeJS手写一个mock数据服务器的方法


Posted in NodeJs onSeptember 10, 2019

对于前端开发者而言,javascript正扮演着越来越重要的地位,它不仅能为浏览器端赋能,在web服务器方面也有很大的价值(我们可以用nodeJS来写服务端代码,启动web服务器),因此本文所要描述的,便是javascript在服务端的应用。我将介绍如何使用nodeJS来搭建一个mock服务器,方便前端自定义mock数据请求,提高前端开发的主观能动性和对项目健壮性的探索。

我们将学到

  • koa基本使用
  • koa-router的基本用法
  • koa-logger的使用
  • glob支持文件遍历查寻
  • node几个核心api的使用
  • 使用nodemon做自动重启

mock服务器基本设计思路

通过目录路径和服务端api的映射关系来实现我们的api访问,比如我们访问接口/api/article/122,我们只需要在mock服务器目录的api的article目录下,创建122.json文件即可,json文件的数据可以自定义,方便前端调试。

5分钟教你用nodeJS手写一个mock数据服务器的方法

具体实现

1.搭建一个node服务

const Koa = require('koa');
const app = new Koa();
app.listen(3000)

2.注册路由 我们使用koa-router来实现后台服务的路由功能,并通过koa提供的上下文ctx将读取到的数据返回给前端:

const Koa = require('koa');
const Router = require('koa-router');
 
const app = new Koa();
const router = new Router({prefix: '/api'});
 
router.get('/name', (ctx, next) => {
  ctx.body = {
    name: 'xuxiaoxi'
  }
 });
 
app
 .use(router.routes())
 .use(router.allowedMethods());
 
app.listen(3000)

这样我们就能实现一个勉强能用的基本的后台api服务器了,当我们请求/api/name时,会返回相应的数据给前台,这一步是我们实现mock服务的关键一步,接下来我们具体来实现目录的遍历和api的自动注册。

3.自动注册api接口并返回数据 我们将在这个阶段实现api服务的自动注册,这里我们使用glob这个第三方模块来遍历目录,并通过node的fs模块读取api文件的数据并返回给前台。glob的使用很简单,感兴趣的朋友可以自行学习,这里就不做过多介绍了。具体实现如下:

const Koa = require('koa');
const Router = require('koa-router');
const glob = require("glob");
const { resolve } = require('path');
const fs = require('fs');
 
const app = new Koa();
const router = new Router({prefix: '/api'});
 
// 注册路由
glob.sync(resolve('./api', "**/*.json")).forEach((item, i) => {
  let apiJsonPath = item && item.split('/api')[1];
  let apiPath = apiJsonPath.replace('.json', '');
  
  router.get(apiPath, (ctx, next) => {
    try {
      let jsonStr = fs.readFileSync(item).toString();
      ctx.body = {
        data: JSON.parse(jsonStr),
        state: 200,
        type: 'success' // 自定义响应体
      }
    }catch(err) {
      ctx.throw('服务器错误', 500);
    }
   });
});
 
app
 .use(router.routes())
 .use(router.allowedMethods());
 
app.listen(3000);

添加控制台日志 我们使用koa-logger实现在终端打印node日志,方便调试,虽然这不是该文章的重点,但是对于想做node开发的前端从业者,还是很有必要了解的。

const logger = require('koa-logger')
app.use(logger());

这样,我们每个请求都会在终端打印出来。

路由映射文件的生成 该功能也不是本文的重点,但是会极大的方便前端开发者调试请求,因为如果api路径很长,我们需要一个个查找,但是有了这个map文件,我们只需要拷贝自动生成的路径即可。具体实现如下:

//...
const routerMap = {}; // 存放路由映射
 
// 注册路由
glob.sync(resolve('./api', "**/*.json")).forEach((item, i) => {
  // ...
  
  // 记录路由
  routerMap[apiJsonPath] = apiPath;
});
 
fs.writeFile('./routerMap.json', JSON.stringify(routerMap, null , 4), err => {
  if(!err) {
    console.log('路由地图生成成功!')
  }
});

基本目录结构

5分钟教你用nodeJS手写一个mock数据服务器的方法

完整代码

clone地址  github地址 

https://github.com/MrXujiang/openCoder/tree/master/mockServer

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
NodeJS框架Express的模板视图机制分析
Jul 19 NodeJs
windows系统下简单nodejs安装及环境配置
Jan 08 NodeJs
轻松创建nodejs服务器(3):代码模块化
Dec 18 NodeJs
nodejs实现获取某宝商品分类
May 28 NodeJs
NodeJS中的MongoDB快速入门详细教程
Nov 11 NodeJs
详解如何在NodeJS项目中优雅的使用ES6
Apr 22 NodeJs
用Nodejs搭建服务器访问html、css、JS等静态资源文件
Apr 28 NodeJs
详解nodejs实现本地上传图片并预览功能(express4.0+)
Jun 28 NodeJs
nodejs 图解express+supervisor+ejs的用法(推荐)
Sep 08 NodeJs
nodejs结合Socket.IO实现的即时通讯功能详解
Jan 12 NodeJs
Nodejs下使用gm圆形裁剪并合成图片的示例
Feb 22 NodeJs
详解Nodejs内存治理
May 13 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 #NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 #NodeJs
nodejs文件夹深层复制功能
Sep 03 #NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 #NodeJs
nodejs简单抓包工具使用详解
Aug 23 #NodeJs
nodejs使用node-xlsx生成excel的方法示例
Aug 22 #NodeJs
Nodejs libuv运行原理详解
Aug 21 #NodeJs
You might like
PHP下几种删除目录的方法总结
2007/08/19 PHP
THINKPHP支持YAML配置文件的设置方法
2015/03/17 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
prototype class详解
2006/09/07 Javascript
可以文本显示的公告栏的js代码
2007/03/11 Javascript
判断脚本加载是否完成的方法
2009/05/26 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
JavaScript学习笔记之ES6数组方法
2016/03/25 Javascript
JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)
2016/08/11 Javascript
Bootstrap3下拉菜单的实现
2017/02/22 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
js canvas实现适用于移动端的百分比仪表盘dashboard
2017/07/18 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
2018/08/14 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
Vue 监听列表item渲染事件方法
2018/09/06 Javascript
Node批量爬取头条视频并保存方法
2018/09/20 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
[05:20]2018DOTA2亚洲邀请赛主赛事第三日战况回顾 LGD率先挺进胜者组决赛
2018/04/06 DOTA
超简单的Python HTTP服务
2019/07/22 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
服务员自我评价
2014/01/25 职场文书
专业技术职务聘任书
2014/03/29 职场文书
考研经验交流会策划书
2015/11/02 职场文书
你离财务总监还有多远?速览CFO的岗位职责
2019/11/18 职场文书
详解Laravel制作API接口
2021/05/31 PHP
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android
Python pandas之求和运算和非空值个数统计
2021/08/07 Python
GO语言异常处理分析 err接口及defer延迟
2022/04/14 Golang
使用 CSS 构建强大且酷炫的粒子动画效果
2022/08/14 HTML / CSS