1.首先创建一个文件夹 这里取名flower,然后在里面自行创建一个db.json文件
- 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文件,内容如图:
3.创建一个index.js文件,里面开始写入一些对json文件增删改查的方法 函数
- 因为这里要使用async方法 所以要下载 第三方模块 then-fs ,然后导入相应的方法
- 控制台输入 npm i then-fs 下载完毕后 如图所示 得到相应的第三方模块包then-fs
// 接下来进入正题
// 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()方法 添加成功 如图所示
使用update()方法 修改成功 如图所示
使用del()方法 删除成功 如图所示
// 个人小结:
// 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对象