基于Koa(nodejs框架)对json文件进行增删改查的示例代码


Posted in NodeJs onFebruary 02, 2019

想使用nodejs(koa)搭建一个完整的前后端,完成数据的增删改查,又不想使用数据库,那使用json文件吧。

本文介绍了基于koa的json文件的增、删、改、查。

代码准备

const Koa = require('koa')
const bodyParser = require('koa-bodyparser')
const Router = require('koa-router')
const fs = require('fs')
const path = require('path')
const app = new Koa()
const router = new Router()
app.use(bodyParser())
// 路由
const deploy = new Router()
// 增删改查接口,可添加在下面

// 装载所有子路由
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设置为空
  let id = ctx.request.body.id
  let params = ctx.request.body.params
  let writeJson = () => {
    return new Promise((resolve,reject)=>{
    // fs模块读取json文件 对fs、path模块不熟悉的可以去查下官方文档
      fs.readFile(path.join(__dirname, '/data/project.json'),function(err,data){
        if(err){
        // 报错返回
          resolve({code: -1, msg: '新增失败' + err})
          return console.error(err);
        }
        let jsonData = 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数组末尾
          let hasRepeat = jsonData.filter((item) => item.id === params.id);
          hasRepeat ? resolve({code: -1, msg: '新增失败,有重复项目id'}) : jsonData.push(params);
        }
        //因为nodejs的写入文件只认识字符串或者二进制数,所以把json对象转换成字符串重新写入json文件中
        let str = 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 = await writeJson()
})

2.删除

删除,这里使用的get方法

deploy.get('/delete', async (ctx) => {
  let id = ctx.request.query.id
  let deleteJson = () => {
    return new Promise((resolve,reject)=>{
      fs.readFile(path.join(__dirname, '/data/project.json'),function(err,data){
        if(err){
          resolve({code: -1, msg: '删除失败' + err})
          return console.error(err);
        }
        let jsonData = 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)
        let str = 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 = await deleteJson()
})

3.查询

deploy.get('/find', async (ctx) => {
// 两种查询方式 1.id为空 => 查询全部 2.id有值 => 查询单个
  let id = ctx.request.query.id
  let findJson = () => {
    return new Promise((resolve,reject)=>{
      fs.readFile(path.join(__dirname, '/data/project.json'),function(err,data){
        if(err){
          resolve({code: -1, msg: '查询失败' + err})
          return console.error(err);
        }
        let jsonData = 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 = await findJson()
})

当然,上面提供的还没有支持分页,想要实现分页,需求改变json格式,如下:

{
 "data": [{"id": 1, "name": "唐僧"},
      {"id": 2, "name": "孙悟空"},
      {"id": 3, "name": "猪八戒"},
      {"id": 4, "name": "沙和尚"}],
 "currentPage": 1,
 "pageSize": 4,
 "pageNum": 1,
 "total": 4
}

新增page一些查询参数,并在使用传入的参数取对应数据。

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

NodeJs 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
NodeJS学习笔记之Http模块
Jan 13 NodeJs
nodejs实现获取某宝商品分类
May 28 NodeJs
使用nodejs开发cli项目实例
Jun 03 NodeJs
Nodejs爬虫进阶教程之异步并发控制
Feb 15 NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 NodeJs
nodejs中各种加密算法的实现详解
Jul 11 NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
Sep 10 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 NodeJs
详解利用nodejs对本地json文件进行增删改查
Sep 20 NodeJs
Nodejs技巧之Exceljs表格操作用法示例
Nov 06 NodeJs
nodejs如何在package.json中设置多条启动命令
Mar 16 NodeJs
用Electron写个带界面的nodejs爬虫的实现方法
Jan 29 #NodeJs
NVM安装nodejs的方法实用步骤
Jan 16 #NodeJs
nodeJS进程管理器pm2的使用
Jan 09 #NodeJs
NodeJS模块与ES6模块系统语法及注意点详解
Jan 04 #NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 #NodeJs
详解nodejs 配置文件处理方案
Jan 02 #NodeJs
nodejs基础之多进程实例详解
Dec 27 #NodeJs
You might like
PHP 和 MySQL 基础教程(一)
2006/10/09 PHP
php magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
PHP 验证码的实现代码
2011/07/17 PHP
cnblogs csdn 代码运行框实现代码
2009/11/02 Javascript
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
Google 爬虫如何抓取 JavaScript 的内容
2017/04/07 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
详解微信小程序获取当前时间及日期的方法
2019/04/28 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
[01:46]辉夜杯—打造中国DOTA新格局
2015/12/25 DOTA
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
Python实现类继承实例
2014/07/04 Python
python标准算法实现数组全排列的方法
2015/03/17 Python
使用Python编写简单的画图板程序的示例教程
2015/12/08 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
Numpy一维线性插值函数的用法
2020/04/22 Python
Python操作word文档插入图片和表格的实例演示
2020/10/25 Python
Html5页面内使用JSON动画的实现
2019/01/29 HTML / CSS
工商管理应届生求职信
2013/10/07 职场文书
英语专业毕业生自荐信范文
2013/12/31 职场文书
安全生产检讨书
2014/01/21 职场文书
企业员工培训感言
2014/02/26 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
企业文化建设实施方案
2014/03/22 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
离职保密承诺书
2014/05/28 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
董事长开业致辞
2015/07/29 职场文书
二胎满月酒致辞
2015/07/29 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
关于教师节的广播稿
2015/08/19 职场文书
在校大学生才艺比赛策划书怎么写?
2019/08/26 职场文书