基于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 提示‘xxx’ 不是内部或外部命令解决方法
Nov 20 NodeJs
NodeJS远程代码执行
Aug 28 NodeJs
详解nodejs 文本操作模块-fs模块(五)
Dec 23 NodeJs
NodeJS遍历文件生产文件列表功能示例
Jan 22 NodeJs
nodejs基础应用
Feb 03 NodeJs
NodeJS仿WebApi路由示例
Feb 28 NodeJs
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
Sep 19 NodeJs
详解使用PM2管理nodejs进程
Oct 24 NodeJs
nodejs爬虫初试superagent和cheerio
Mar 05 NodeJs
nodejs更改项目端口号的方法
May 13 NodeJs
nodejs基础之多进程实例详解
Dec 27 NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 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应用JSON技巧讲解
2013/02/03 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
2014/01/31 PHP
举例讲解PHP面对对象编程的多态
2015/08/12 PHP
php中照片旋转 (orientation) 问题的正确处理
2017/02/16 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
jquery实现图片随机排列的方法
2015/05/04 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
2019/04/22 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
[00:55]2015国际邀请赛中国区预选赛5月23日——28日约战上海
2015/05/25 DOTA
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
用Python写的图片蜘蛛人代码
2012/08/27 Python
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
Python 爬虫模拟登陆知乎
2016/09/23 Python
Python实现计算两个时间之间相差天数的方法
2017/05/10 Python
PyTorch学习笔记之回归实战
2018/05/28 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
2018/08/05 Python
使用python来调用CAN通讯的DLL实现方法
2019/07/03 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
python中下标和切片的使用方法解析
2019/08/27 Python
python retrying模块的使用方法详解
2019/09/25 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
报告会主持词
2014/04/02 职场文书
团代会宣传工作方案
2014/05/08 职场文书
学习型班组申报材料
2014/05/31 职场文书
运动会开幕词
2015/01/28 职场文书
特岗教师个人总结
2015/02/10 职场文书
房地产销售主管岗位职责
2015/02/13 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
2016年小学教师政治学习心得体会
2016/01/23 职场文书