概述

nodeJs实现本地数据库、 nodeJs中fs.writeFile的坑

在写一个移动端vue项目的时候突发奇想,既然MongoDB 存储的json 格式的数据,那能不能在写接口的时候在接口文件中 直接创建一个db 文件 储存 数据呢? 学过 nodeJs fs模块的同学或许不知道它的强大, 通过fs 模块,我们完全可以实现 数据的增删改查,下面 直接上代码吧。

先看一下目录结构
在这里插入图片描述

下面说得很详细了,还有疑惑的小伙伴可以在评论区艾特俺哦,会及时回复的。

/* json 增 
*@params  写入的内容
*@path_way   写入的文件 路径
*/
let writeJson = (params, path_way) => {
  // 现将json文件读出来
  fs.readFile(path_way, (err, data) => {
    if (err) {
      return console.error("读取失败:", err);
    }
    let person = data.toString(); //将二进制数据转为字符串
    person = JSON.parse(person);  //将字符串转换为json 对象
    person.data.push(params);     //将传来的对象 push 进数组对象中
    person.total = person.data.length;//定义一下总条数, 为以后的分页打基础
    console.log(person.data);
    // 因为 nodejs 的写入文件 只认识字符串 或 二进制数,
    // 所以把 json 对象转换成字符串重新写入 json 文件中
    let str = JSON.stringify(person);
    fs.writeFile(path_way, str, err => {
      if (err) {
        console.error("重写失败:", err);
      }
      console.log('----------  新增成功  -----------');
    })
  })
};
// writeJson(params, './db/pet/pet/pet.json');

/* json  删 
* @id   要删除的对象的 id
* @path_way   删除的对象的 文件路径
*/
let deleteJson = (id, path_way) => {
  fs.readFile(path_way, (err, data) => {
    if (err) {
      return console.error("读取失败:", err);
    }
    let person = data.toString();
    person = JSON.parse(person);
    // 把数据读出来 删除
    let temp = person.data.some((val, index) => {
      if (id == val.id) {
        person.data.splice(index, 1);
      }
      return id == val.id;
    })
    if (!temp) {
      console.log('----------  没有该 id  -----------');
      return false;
    }
    // console.log(person.data);
    person.total = person.data.length;
    let str = JSON.stringify(person);
    // 然后再把数据重写进去
    fs.writeFile(path_way, str, err => {
      if (err) {
        console.error("重写失败:", err);
      }
      console.log('----------  删除成功  -----------');
    })
  })
};
// deleteJson(3, './db/pet/pet.json');

/* json 修改 */
let changeJson = (params, path_way) => {
  fs.readFile(path_way, (err, data) => {
    if (err) {
      return console.error("读取失败:", err);
    }
    let person = data.toString();
    person = JSON.parse(person);
    // 把数据读出来 修改
    let temp = person.data.some(val => {
      // 如果 id 相同 进行覆盖, 否则 push 进去
      if (params.id == val.id) {
        // 遍历 params
        for (let key in params) {
          if (val[key]) {
            val[key] = params[key];
          }
        }
      }
      // 判断是否存在该 id 对象
      return params.id == val.id;
    })
    if (!temp) {
      console.log('----------  不存在该 id对象,追加成功 -----------');
      person.data.push(params);
    }
    person.total = person.data.length;
    let str = JSON.stringify(person);
    // 然后再把数据重写进去
    fs.writeFile(path_way, str, err => {
      if (err) {
        console.error("重写失败:", err);
      }
      console.log('----------  修改成功  -----------');
    })
  })
};
// changeJson(params, './db/pet/pet.json');

/* json 查   通过传回来的页数,获取  ((p - 1) * s, p * s)  之间的数据
*@p   页数
*@s   每页多少条数据
*@path_way  json文件路径
*/
let pagination = (p, s, path_way) => {
  return (
    // 这里建议用同步方法,否则查询的时候会出现代码覆盖为undefined 的问题,
    // 同步方法默认 返回 buffer 类型 , 通过设置 utf-8 修改返回的类型
    fs.readFileSync(path_way, 'utf-8', (err, data) => {
      if (err) {
        return console.error("读取失败:", err);
      }
      let person = data.toString();
      person = JSON.parse(person);
      console.log(person)
      // 读出数据
      let pagePerson = person.data.slice((p - 1) * s, p * s);
      console.log('----------  查询成功  -----------', pagePerson)
      return pagePerson;
    })
  )
}
// pagination(1, 3, './db/pet/pet.json');

注意事项(踩坑)

在这里插入图片描述
1、这里的 fs.writeFile 必须是异步的,当使用fs.writeFileSync 同步方法时,由于windows 系统的安全策略,会导致存不进去 报错。
2、可以写一段代码自行测试一下,细节要点大部分都 附在代码片段中了。
测试片段

当写入的时候不存在文件,则自动创建文件的方法

链接: nodejs判断文件、文件是否存在,自动创建.
·

🧡
如果觉得有用的话可以点个赞哦! 欢迎大牛们评论区交流 !

Logo

前往低代码交流专区

更多推荐