当前位置: 首页 > 科技观察

五分钟教你用NodeJS写一个mock数据服务器

时间:2023-03-13 03:20:26 科技观察

对于前端开发者来说,javascript扮演着越来越重要的角色。它不仅可以为浏览器赋能,而且对web服务器的价值也起到了很大的作用(我们可以使用nodeJS编写服务器端代码,启动web服务器),所以本文要讲述的是javascript的应用在服务器端。将介绍如何使用nodeJS搭建mock服务器,方便前端自定义mock数据请求,提高前端开发的主观能动性,探索项目的健壮性。我们将通过目录路径之间的映射关系,学习koa使用koa-router和koa-logger使用glob支持文件遍历和查询使用node的几个核心API使用nodemon自动重启mockserver基本设计思路和服务端API实现我们的api访问,比如我们访问接口/api/article/122时,只需要在mock服务端目录下的api文章目录下创建122.json文件即可。json文件的数据可以自定义,方便前端调试。具体实现1.构建节点服务constKoa=require('koa');constapp=newKoa();app.listen(3000)2.注册路由我们使用koa-router来实现后台服务的路由功能并提供通过koa上下文ctx将读取到的数据返回给前端:constKoa=require('koa');constRouter=require('koa-router');constapp=newKoa();constrouter=newRouter({prefix:'/api'});router.get('/name',(ctx,next)=>{ctx.body={name:'xuxiaoxi'}});app.use(router.routes()).use(router.allowedMethods());app.listen(3000)这样我们就可以实现一个勉强能用的基础后台apiserver。当我们请求/api/name时,会把相应的数据返回给前台。这一步是我们实现mock服务的关键一步,接下来我们要实现目录的遍历和api的自动注册。3、自动注册API接口并返回数据我们将在这个阶段实现API服务的自动注册。这里我们使用第三方模块glob遍历目录,通过node的fs模块读取API文件的数据返回给前台。glob的使用非常简单,有兴趣的朋友可以自行学习,这里就不做过多介绍了。具体实现如下:constKoa=require('koa');constRouter=require('koa-router');constglob=require("glob");const{resolve}=require('path');constfs=require('fs');constapp=newKoa();constrouter=newRouter({prefix:'/api'});//注册路由glob.sync(resolve('./api',"**/*.json")).forEach((item,i)=>{letapiJsonPath=item&&item.split('/api')[1];letapiPath=apiJsonPath.replace('.json','');router.get(apiPath,(ctx,next)=>{try{letjsonStr=fs.readFileSync(item).toString();ctx.body={data:JSON.parse(jsonStr),state:200,type:'success'//自定义响应body}}catch(err){ctx.throw('服务器错误',500);}});});app.use(router.routes()).use(router.allowedMethods());app.listen(3000);添加控制台日志我们使用koa-logger在终端打印节点日志,方便调试。虽然这不是本文的重点,但是对于想做节点开发的前端从业者来说还是有必要了解一下的。constlogger=require('koa-logger')app.use(logger());这样我们的每一个请求都会打印到终端上。生成路由映射文件的功能不是本文的重点,但是它会极大的方便前端开发者调试请求,因为如果api路径很长,我们需要一一查找,但是有了这个映射文件,我们只需要复制自动生成的路径即可。具体实现如下://...constrouterMap={};//存储路由映射//注册路由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('路由映射生成成功!')}});基本目录结构