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

基于koa(nodejs框架)的json文件增删改查

时间:2023-04-04 00:58:51 Node.js

如果想使用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())//routeconstdeploy=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.idletparams=ctx.request.body.paramsletwriteJson=()=>{returnnewPromise((resolve,reject)=>{//fs模块读取json文件如果对fs和path模块不熟悉,可以查看官方文档fs.readFile(path.join(__dirname,'/data/project.json'),function(err,data){if(err){//错误returnresolve({code:-1,msg:'Addfailure'+err})returnconsole.error(err);}letjsonData=data.toString();//转换二进制数据ForstringjsonData=JSON.parse(jsonData);//将字符串转换为json对象//带id值=>修改无id值=>添加if(id){jsonData.splice(jsonData.findIndex(item=>item.id===id),1,params)}else{//duplicate=>return-1noduplicate=>添加params到json数组的末尾让hasRepeat=jsonData.filter((item)=>item.id===params.id);有重复吗?resolve({code:-1,msg:'添加失败,存在重复的itemid'}):jsonData.推(参数);}//因为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.删除delete,这里使用的get方法deploy.get('/delete',async(ctx)=>{letid=ctx.request.query.idletdeleteJson=()=>{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和拼接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.idletfindJson=()=>{returnnewPromise((resolve,reject)=>{fs.readFile(path.join(__dirname,'/data/project.json'),function(err,data){if(err){resolve({code:-1,msg:'queryfailed'+err})returnconsole.error(err);}letjsonData=data.toString();//将二进制数据转换为字符串jsonData=JSON.parse(jsonData);//将字符串转为json对象//有id值=>单个无id值=>allif(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}添加一些页面查询参数,使用传入的参数获取对应的数据