读取文件
本课属于 Coddy Node.js 学习旅程的“Node.js 基础”单元。第 12 课,共 33 课。
每次运行都会从相同的 3 条笔记开始,因为它们只存在于内存中。
readFileSync(path, 'utf8')(来自 node:fs)会将文件读取为字符串。笔记文件中存储的是 JSON,这是一种文本格式,用类似 JavaScript 数组和对象的形式编写数据,而 JSON.parse 会将这些文本转换为数组。读取不存在的文件会抛出 ENOENT 错误,所以要先用 existsSync 检查。示例使用了 condition ? a : b,当条件为 true 时返回 a,当条件为 false 时返回 b。
import { existsSync, readFileSync } from 'node:fs';
const scores = existsSync('scores.json')
? JSON.parse(readFileSync('scores.json', 'utf8'))
: [];
console.log(scores.length);如果不使用 'utf8',得到的会是 Buffer,也就是文件的原始字节,而不是字符串。
挑战
简单这一步会打开课程中准备好的命令行工具项目,而不是你在CommonJS Modules中的项目文件(包括 legacy/stats.cjs)。你之前的工作会保留在原来的课中。编辑 store.js 前,先阅读提供的文件。这份副本包含目前为止的所有命令,以及一个新的 clear 命令。
现在,每次运行都会从 store.js 中写死的相同三条笔记开始。你的笔记应该来自一个文件:notes.json。你可以在 Files 中打开这个文件。
- 在
store.js中,替换固定的三条笔记列表。存储对象的notes必须保存notes.json中的数组:先将文件读作文本,再将 JSON 文本转换为数组。 - 如果
notes.json不存在,存储对象应以空数组开始,而不是因错误而停止。读取文件前,先检查文件是否存在。
notes.json 中有两条笔记,因此运行 node notes.js list 会输出:
Notes for you
1. Buy milk
2. Call Ada如果没有 notes.json,输出会是:
Notes for you
No notes yet你只需要修改 store.js。存储对象为空时,notes.js 已经会输出 No notes yet。
试试看:在 $ node notes.js 后面的输入框中输入 list,然后按 Enter。你会看到文件中的两条笔记。接着输入 clear。notes.js 中已经有这个命令:它会删除 notes.json 并输出 Deleted notes.json。再次输入 list,你会看到 No notes yet。按“检查”前,先按“重置文件”,恢复 notes.json,因为检查需要这个文件。
亲手试试
// 从 notes.json 加载笔记,不要使用这个列表。
const store = {
notes: ['Buy milk', 'Call Ada', 'Water the plants'],
add(text) {
this.notes.push(text);
return this.notes.length;
},
};
export default store;
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
Node.js 基础中的所有课
自己练习: Express 在线编辑器