Menu
CoddyTech

写入文件

本课属于 Coddy Node.js 学习旅程的“Node.js 基础”单元。第 14 课,共 33 课。

程序一结束,add 就会忘记这条笔记。

writeFileSync(path, text) 会写入文件,并替换文件原有的所有内容。JSON.stringify 会将数组转换为 JSON 文本,而 null, 2 会用两个空格缩进文本,让它在 Files 中更易读。

import { writeFileSync } from 'node:fs';

const scores = [12, 40];
scores.push(31);
writeFileSync('scores.json', JSON.stringify(scores, null, 2));

文件中始终会写入整个数组:加载笔记,添加一条,再把所有笔记写回文件。在 store.js 中,add 是 store 对象的方法。在方法中,this 就是对象本身,所以 this.notes 是 store 的数组。直接传入数组会导致错误,因为文件中存放的是文本。

challenge icon

挑战

简单

这一步会打开课程中准备好的笔记命令行工具项目,而不是你在读取文件课中的项目文件(包括 store.js)。之前的练习仍保留在原来的课中。编辑 store.js 前,先阅读提供的文件。这个副本包含一个可读取文件的笔记工具。

程序结束后,add 仍会忘记这条笔记。让它把每条笔记都保存到 notes.json,这样下次运行时,list 就会显示这条笔记。

  1. 在 store.js 中,add 将新笔记放入数组后,把整个数组作为 JSON 写回 notes.json。写入每条笔记,而不只是新笔记:写入文件会替换文件中的所有内容。将 JSON 缩进设为两个空格,这样在 Files 中更容易阅读。
  2. 在 notes.js 的 add 分支中,替换打印 Adding: ... 的那一行。现在它只会打印 Saved note 、新笔记的编号和句号。如果 notes.json 中以这两条笔记开头,运行 node notes.js add Buy bread 会打印:
    Saved note 3.
    此时 notes.json 中会有:
    [
      "Buy milk",
      "Call Ada",
      "Buy bread"
    ]
  3. 如果没有 notes.json,add 会创建这个文件。运行 clear 后,再运行 node notes.js add Call Ada,会打印 Saved note 1.,然后运行 list 会显示 1. Call Ada。

试试看:在 $ node notes.js 后面的输入框中输入 add Buy bread,然后按 Enter。你会看到 Saved note 3.。输入 list:即使这是一次新的运行,Buy bread 现在也是第 3 条笔记。在 Files 中打开 notes.json,查看保存的数组。然后输入 clear 删除文件,再输入 add Call Ada:你会看到 Saved note 1.。

亲手试试

import { existsSync, readFileSync } from 'node:fs';

const file = 'notes.json';

const store = {
    notes: existsSync(file) ? JSON.parse(readFileSync(file, 'utf8')) : [],
    add(text) {
        this.notes.push(text);
        return this.notes.length;
    },
};

export default store;

Node.js 基础中的所有课

自己练习: Express 在线编辑器