基于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 相关文章推荐
将nodejs打包工具整合到鼠标右键的方法
May 11 NodeJs
轻松创建nodejs服务器(3):代码模块化
Dec 18 NodeJs
NodeJS学习笔记之FS文件模块
Jan 13 NodeJs
Nodejs中的this详解
Mar 26 NodeJs
Nodejs如何搭建Web服务器
Mar 28 NodeJs
nodejs 的 session 简单使用
Jun 06 NodeJs
Nodejs下DNS缓存问题浅析
Nov 16 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
Windows下快速搭建NodeJS本地服务器的步骤
Aug 09 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 NodeJs
nodejs实现的http、https 请求封装操作示例
Feb 06 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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
javascript 图片裁剪技巧解读
2012/11/15 Javascript
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
浅谈JS闭包中的循环绑定处理程序
2014/11/09 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
Vue.js中数据绑定的语法教程
2017/06/02 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
JS严格模式知识点总结
2018/02/27 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
2018/07/19 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
[38:39]完美世界DOTA2联赛循环赛 IO vs GXR BO2第二场 11.04
2020/11/05 DOTA
python实现在IDLE中输入多行的方法
2018/04/19 Python
Python: 传递列表副本方式
2019/12/19 Python
Python如何对XML 解析
2020/06/28 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
2020/06/30 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
Skyscanner新西兰:全球领先的旅游搜索网站
2019/08/26 全球购物
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
小学生新学期寄语
2014/01/19 职场文书
酒店个人求职信范文
2014/01/25 职场文书
公安民警正风肃纪剖析材料
2014/10/10 职场文书
地震捐款简报
2015/07/21 职场文书
2015年教导处教学工作总结
2015/07/22 职场文书
感谢师恩主题班会
2015/08/17 职场文书
golang中的空接口使用详解
2021/03/30 Python
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL
bat批处理之字符串操作的实现
2022/03/16 Python
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL