基于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服务器(8):非阻塞是如何实现的
Dec 18 NodeJs
nodejs搭建本地服务器并访问文件的方法
Mar 03 NodeJs
nodejs+express实现文件上传下载管理网站
Mar 15 NodeJs
使用 NodeJS+Express 开发服务端的简单介绍
Apr 07 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
nodejs实现爬取网站图片功能
Dec 14 NodeJs
nodejs实现简单的gulp打包
Dec 21 NodeJs
详解NodeJs开发微信公众号
May 25 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 NodeJs
nodejs脚本centos开机启动实操方法
Mar 04 NodeJs
Nodejs在局域网配置https访问的实现方法
Oct 17 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 Notice: Undefined index 错误提示解决方法
2010/08/29 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
php中session与cookie的比较
2015/01/27 PHP
php获取flash尺寸详细数据的方法
2016/11/12 PHP
jQuery ul标签下拉菜单演示代码
2010/12/11 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
javascript计时器事件使用详解
2014/01/07 Javascript
JQuery替换DOM节点的方法
2015/06/11 Javascript
jQuery实现tab选项卡效果的方法
2015/07/08 Javascript
再谈JavaScript线程
2015/07/10 Javascript
JavaScript实现的浮动层框架用法实例分析
2015/10/10 Javascript
javascript基本语法
2016/05/31 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
微信小程序表单验证错误提示效果
2017/05/19 Javascript
jquery ajaxfileupload异步上传插件
2017/11/21 jQuery
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
[36:33]Ti4 循环赛第四日 附加赛NEWBEE vs Mouz
2014/07/13 DOTA
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
Python中正则表达式的详细教程
2015/04/30 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
通过pycharm使用git的步骤(图文详解)
2019/06/13 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
Python实现查找数据库最接近的数据
2020/06/08 Python
python利用os模块编写文件复制功能——copy()函数用法
2020/07/13 Python
python中count函数知识点浅析
2020/12/17 Python
CSS3实现银灰色动画效果的导航菜单代码
2015/09/01 HTML / CSS
伦敦哈德森鞋:Hudson Shoes
2018/02/06 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
比较基础的php面试题及答案-填空题
2014/04/26 面试题
五年级学生评语
2014/04/22 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
新闻传播专业求职信
2014/07/22 职场文书
运动会广播稿200米(5篇)
2014/10/15 职场文书
2015年党员承诺书
2015/01/21 职场文书
六一文艺汇演主持词
2015/06/30 职场文书