基于Koa(nodejs框架)对json文件进行增删改查的示例代码
想使用nodejs(koa)搭建一个完整的前后端,完成数据的增删改查,又不想使用数据库,那使用json文件吧。
本文介绍了基于koa的json文件的增、删、改、查。
代码准备
constKoa=require('koa') constbodyParser=require('koa-bodyparser') constRouter=require('koa-router') constfs=require('fs') constpath=require('path') constapp=newKoa() constrouter=newRouter() app.use(bodyParser()) //路由 constdeploy=newRouter() //增删改查接口,可添加在下面 //装载所有子路由 router.use('/deploy',deploy.routes(),deploy.allowedMethods()) app.use(router.routes()).use(router.allowedMethods()) app.listen(3000);
json示例
[ {"id":1,"name":"唐僧"}, {"id":2,"name":"孙悟空"}, {"id":3,"name":"猪八戒"}, {"id":4,"name":"沙和尚"} ]
1.新增和修改
新增和修改可以分开,但是为了省代码就合并在一起了。
deploy.post('/add-modify',async(ctx)=>{ //这里使用的bodyParser来解析post请求传来的数据,id是用来查找之前有的数据并进行修改,新增数据的在前台应该将id设置为空 letid=ctx.request.body.id letparams=ctx.request.body.params letwriteJson=()=>{ returnnewPromise((resolve,reject)=>{ //fs模块读取json文件对fs、path模块不熟悉的可以去查下官方文档 fs.readFile(path.join(__dirname,'/data/project.json'),function(err,data){ if(err){ //报错返回 resolve({code:-1,msg:'新增失败'+err}) returnconsole.error(err); } letjsonData=data.toString();//将二进制的数据转换为字符串 jsonData=JSON.parse(jsonData);//将字符串转换为json对象 //有id值=>修改无id值=>新增 if(id){ jsonData.splice(jsonData.findIndex(item=>item.id===id),1,params) }else{ //有重复=>返回-1无重复=>将params加到json数组末尾 lethasRepeat=jsonData.filter((item)=>item.id===params.id); hasRepeat?resolve({code:-1,msg:'新增失败,有重复项目id'}):jsonData.push(params); } //因为nodejs的写入文件只认识字符串或者二进制数,所以把json对象转换成字符串重新写入json文件中 letstr=JSON.stringify(jsonData); fs.writeFile(path.join(__dirname,'/data/project.json'),str,function(err){ if(err){ resolve({code:-1,msg:'新增失败'+err}) } resolve({code:0,msg:'新增成功'}) }) }) }) } //返回给前端 ctx.body=awaitwriteJson() })
2.删除
删除,这里使用的get方法
deploy.get('/delete',async(ctx)=>{ letid=ctx.request.query.id letdeleteJson=()=>{ returnnewPromise((resolve,reject)=>{ fs.readFile(path.join(__dirname,'/data/project.json'),function(err,data){ if(err){ resolve({code:-1,msg:'删除失败'+err}) returnconsole.error(err); } letjsonData=data.toString();//将二进制的数据转换为字符串 jsonData=JSON.parse(jsonData);//将字符串转换为json对象 //过滤出所存item的id和前端传来id不等的item,下面提供了两种方法filter和splice jsonData=jsonData.filter((item)=>item.id!==id); //jsonData.splice(jsonData.findIndex(item=>item.id===id),1) letstr=JSON.stringify(jsonData); fs.writeFile(path.join(__dirname,'/data/project.json'),str,function(err){ if(err){ resolve({code:-1,msg:'删除失败'+err}) } resolve({code:0,msg:'删除成功'}) }) }) }) } ctx.body=awaitdeleteJson() })
3.查询
deploy.get('/find',async(ctx)=>{ //两种查询方式1.id为空=>查询全部2.id有值=>查询单个 letid=ctx.request.query.id letfindJson=()=>{ returnnewPromise((resolve,reject)=>{ fs.readFile(path.join(__dirname,'/data/project.json'),function(err,data){ if(err){ resolve({code:-1,msg:'查询失败'+err}) returnconsole.error(err); } letjsonData=data.toString();//将二进制的数据转换为字符串 jsonData=JSON.parse(jsonData);//将字符串转换为json对象 //有id值=>单个无id值=>全部 if(id){ jsonData=jsonData.filter((item)=>item.id===id); resolve({code:0,data:jsonData}) }else{ resolve({code:0,data:jsonData}) } }) }) } ctx.body=awaitfindJson() })
当然,上面提供的还没有支持分页,想要实现分页,需求改变json格式,如下:
{ "data":[{"id":1,"name":"唐僧"}, {"id":2,"name":"孙悟空"}, {"id":3,"name":"猪八戒"}, {"id":4,"name":"沙和尚"}], "currentPage":1, "pageSize":4, "pageNum":1, "total":4 }
新增page一些查询参数,并在使用传入的参数取对应数据。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。