基于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异步回调的优雅处理方法
Sep 25 NodeJs
windows下安装nodejs及框架express
Aug 07 NodeJs
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
Jan 12 NodeJs
nodejs基础应用
Feb 03 NodeJs
搭建简单的nodejs http服务器详解
Mar 09 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
NodeJS使用七牛云存储上传文件的方法
Jul 24 NodeJs
详解Nodejs mongoose
Jun 10 NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 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
星际争霸秘籍
2020/03/04 星际争霸
深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念
2013/06/06 PHP
PHP 实现explort() 功能的详解
2013/06/20 PHP
PHP计算百度地图两个GPS坐标之间距离的方法
2015/01/09 PHP
javascript StringBuilder类实现
2008/12/22 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
angularjs使用directive实现分页组件的示例
2017/02/07 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
Vue使用mixin分发组件的可复用功能
2019/09/01 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python批量修改文件后缀的方法
2014/01/26 Python
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
Python绘制3D图形
2018/05/03 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
Python 读取用户指令和格式化打印实现解析
2019/09/02 Python
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
美国婴儿和儿童服装购物网站:PatPat
2020/10/01 全球购物
财务管理专业毕业生求职信范文
2013/09/21 职场文书
员工薪酬福利制度
2014/01/17 职场文书
企业管理培训感言
2014/01/27 职场文书
读书小明星事迹材料
2014/05/03 职场文书
中层干部培训方案
2014/06/16 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
2015个人年度工作总结范文
2015/05/28 职场文书
Mysql 设置boolean类型的操作
2021/06/04 MySQL
浅谈mysql增加索引不生效的几种情况
2021/06/23 MySQL
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL