node 实现持久化存储之文件系统数据库

850 阅读1分钟

其实现原理是使用 readline 模块提供的接口将用户在命令行中输入的内容存储到某个文件里

读取文件

定义一个 get 方法读取文件内容

function get(key) {
  fs.readFile("./db.json", (err, data) => {
    if (err) {
      console.log(err)
    }
    // 将二进制流转换成字符串成并转成Object对象 
    const json = JSON.parse(data.toString());
    console.log(json[key]);
  });
}

设置文件

定义一个 set 方法设置文件内容

function set(key, value) {
  fs.readFile("./db.json", (err, data) => {
    // 可能是空文件,则设置为空对象
    const json = data ? JSON.parse(data) : {};
    json[key] = value; // 设置值
    // 重新写入文件
    fs.writeFile("./db.json", JSON.stringify(json), err => {
      if (err) {
        console.log(err);
      }
      console.log("写入成功!");
    });
  });
}

命令行内容读取

我们使用 readline 模块提供的接口来读取命令行中的内容

readline 模块提供了一个接口,用于一次一行的读取 可读流 (例如 process.stdin)中的数据。

// 命令行接口部分
const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.on("line", function(input) {
  const [op, key, value] = input.split(" ");
    // 获取内容
  if (op === 'get') {
    get(key)
  } else if (op === 'set') {
    // 设置内容
    set(key, value)
  } else if(op === 'quit'){
    // 退出 readline
    rl.close();
  }else {
    console.log('没有该操作');
  }
});

rl.on("close", function() {
  console.log("程序结束");
  process.exit(0);
});

每当 input 流接收到行尾输入(\n\r\r\n)时就会触发 'line' 事件。 这种情况通常发生在当用户按下 <Enter> 键或 <Return> 键。因此我们通过监听 line 事件来获取用户在命令行中输入的内容。