node js 使用async方法 对json文件进行增删改查 (下一篇联动创建服务器)

386 阅读4分钟

1.首先创建一个文件夹 这里取名flower,然后在里面自行创建一个db.json文件

snipaste20220305_144658.jpg

  • json文件内容 如图所示:
[
  {
    "id": 1,
    "bookname": "西游记",
    "author": "吴承恩",
    "publisher": "武汉出版社"
  },
  {
    "publisher": "轻云出月风静夜",
    "bookname": "落花",
    "author": "浅唱",
    "id": 5
  },
  {
    "publisher": "晨曦惊扰了陌上新桑",
    "bookname": "落花",
    "author": "浅唱",
    "id": 6
  },
  {
    "publisher": "浓墨追逐着情绪流淌",
    "bookname": "落花",
    "author": "浅唱",
    "id": 7
  },
  {
    "publisher": "屐齿轻踩着烛影摇晃",
    "bookname": "落花",
    "author": "浅唱",
    "id": 8
  },
  {
    "publisher": "火光描摹容颜燃尽了时间",
    "bookname": "落花",
    "author": "浅唱",
    "id": 9
  }
]

2.接下来在该文件家里面进入控制台 进行npm init -y 初始化 (-y是默认设置) 得到一个package.json文件,内容如图:

snipaste20220305_144927.jpg

3.创建一个index.js文件,里面开始写入一些对json文件增删改查的方法 函数

  • 因为这里要使用async方法 所以要下载 第三方模块 then-fs ,然后导入相应的方法
  • 控制台输入 npm i then-fs 下载完毕后 如图所示 得到相应的第三方模块包then-fs

snipaste20220305_145810.jpg

// 接下来进入正题
// 1.先初始化,获取内置模块path 方法 还有第三方then-fs方法

// 拼接db.json的绝对路径
const { join } = require('path')

const filename = join(__dirname,'db.json')
// 注意:
// __dirname为当前文件所在的文件夹的绝对路径
// __filename为当前文件绝对路径

// console.log(filename) 可以打印出来验证路径是否正确

// 第三方模块then-fs 使用他的方法会返回一个promise对象
// 通过解构方式获取then-fs里面的 读取和写入文件两个方法
const { readFile,writeFile } = require('then-fs')


//`````````````````````查```````````````````````


async function query() {
  // 因为使用的async方法,所以readFile(filename, 'utf-8') 得到的是一个promise对象
  // 里面包着内容但是无法读取,里面还是<pending>进行时状态
  // 因此 在左边加上await 将json内容读取出来 
  let arr = await readFile(filename, 'utf-8')
  

  // console.log(JSON.parse(arr))

  return  JSON.parse(arr)
  // 这里将 arr获取的把获取到的数据转换成js对象 这里外面还是数组包着的 里面是对象
  // 返回是为了在后面的增删改方法中直接调用这个返回值 进行使用
  // 虽然这里返回的是数组arr 但是后面调用query方法会得到一个promise对象
}

// query()


//`````````````````````增```````````````````````
async function add(obj) {
   let arr = await query() 
   //  query() 是一个promise对象 使用 await将其内容解析出来 变回数组
   
   // 往读取的数组中push一个对象,这个对象的id给其赋予最后一条数据的id+1
   obj.id = arr[arr.length - 1].id + 1
   
   arr.push(obj) // 将这个对象放进数组中
   
   // console.log(JSON.stringify(arr)) // 转换成了json对象
   
   return await writeFile(filename, JSON.stringify(arr)) //写进去
  // 这里返回的值虽然是undefined 但是获取后得到的是一个promise对象

}
// add({bookname: '活着',author: '深化',publisher: '人民出版社'})



//`````````````````````改```````````````````````
async function update(obj) {
  let arr = await query()

  // 找到这个要修改的id的元素的 下标 
  let index = arr.findIndex(ele => {
    return ele.id == obj.id
  })

  console.log(index)

  arr.splice(index, 1, obj) // 删除 替换

  return await writeFile(filename, JSON.stringify(arr))

}

// update({ publisher: '人民出版社', bookname: '深化', author: '省会',id: 1 })



//`````````````````````删```````````````````````
async function del(id) {
  // 根据id删除图书
  let arr = await query()  // 获取promise对象

  let newArr = arr.filter(ele => {
    return ele.id != id
  })

  // console.log(newArr)
  return await writeFile(filename, JSON.stringify(newArr)) // 返回undefined 但是拿到后是promise对象
  // 后面做判断用

}
// del(5)


// 导出方法
module.exports = {
  del,
  add,
  update,
  query
}

使用add()方法 添加成功 如图所示

snipaste20220305_154216.jpg

使用update()方法 修改成功 如图所示

snipaste20220305_160339.jpg

使用del()方法 删除成功 如图所示

snipaste20220305_160722.jpg

// 个人小结:

// join(__dirname, 'db.json')  使用内置模块path里面的join方法拼接路径时  ','逗号会转换成 '\'
// let p =  readFile(filename, 'utf-8')  p得到的是一个promise对象 里面保存了db.json文件里面的内容
// 如何获取里面的内容呢?   通过await 或者 then 方法 来 获取promise对象里面的内容 拿到的数据是json格式
// 第三方模块 then-fs 他读取文件会返回一个promise对象
// const { readFile,writeFile }  = require('then-fs')  通过这种方式直接拿到里面的方法 不用再 元素.方法形式

//                                       查
// let  p  =  readFile(filename, 'utf-8')  p得到的是一个promise对象 里面保存了db.json文件里面的内容
// let res = await p 通过await获取了promise对象里面的内容
// let arr = JSON.parse(res) // 把获取到的数据转换成js对象
// 拿到的json文件 通过 JSON.parse(res) 拿到一个 js对象 返回的 整体是一个数组 因为本身就是一个数组框包起来的数据
// return arr // 虽然这里返回的是数组arr 但是调用 query方法会得到一个promise对象
// 因此在别处调用这个方法时  需要再次使用await 来获取里面的内容
// 不然单纯的 得到的就是 { promise <pending(进行时)> }

// 在增删改中 async function add() { ... }
// return await writeFile(filename, JSON.stringify(arr)) 
// 添加,删除或者修改成功后, 这里返回的的值都是undefined 但是由于他在async函数里面
// 所以当调用这个函数时 等下还是会得到这个pormise对象