基于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一些查询参数,并在使用传入的参数取对应数据。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。