基于Koa(nodejs框架)对json文件进行增删改查

栏目: Node.js · 发布时间: 5年前

内容简介:想使用nodejs(koa)搭建一个完整的前后端,完成数据的增删改查,又不想使用数据库,那使用json文件吧。本文介绍了基于koa的json文件的新增和修改可以分开,但是为了省代码就合并在一起了。

想使用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一些查询参数,并在使用传入的参数取对应数据。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Developer's Guide to Social Programming

Developer's Guide to Social Programming

Mark D. Hawker / Addison-Wesley Professional / 2010-8-25 / USD 39.99

In The Developer's Guide to Social Programming, Mark Hawker shows developers how to build applications that integrate with the major social networking sites. Unlike competitive books that focus on a s......一起来看看 《Developer's Guide to Social Programming》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码