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

读取文件

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

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

设置文件

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

  1. function set(key, value) {
  2. fs.readFile("./db.json", (err, data) => {
  3. // 可能是空文件,则设置为空对象
  4. const json = data ? JSON.parse(data) : {};
  5. json[key] = value; // 设置值
  6. // 重新写入文件
  7. fs.writeFile("./db.json", JSON.stringify(json), err => {
  8. if (err) {
  9. console.log(err);
  10. }
  11. console.log("写入成功!");
  12. });
  13. });
  14. }

命令行内容读取

我们使用 readline 模块提供的接口来读取命令行中的内容
readline 模块提供了一个接口,用于一次一行的读取 可读流 (例如 process.stdin)中的数据。

  1. // 命令行接口部分
  2. const readline = require("readline");
  3. const rl = readline.createInterface({
  4. input: process.stdin,
  5. output: process.stdout
  6. });
  7. rl.on("line", function(input) {
  8. const [op, key, value] = input.split(" ");
  9. // 获取内容
  10. if (op === 'get') {
  11. get(key)
  12. } else if (op === 'set') {
  13. // 设置内容
  14. set(key, value)
  15. } else if(op === 'quit'){
  16. // 退出 readline
  17. rl.close();
  18. }else {
  19. console.log('没有该操作');
  20. }
  21. });
  22. rl.on("close", function() {
  23. console.log("程序结束");
  24. process.exit(0);
  25. });

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