Kodokon kodokon.com

Файловая система: чтение и запись через fs/promises

Ты читаешь и записываешь файлы с помощью модуля fs/promises и строишь надёжные пути благодаря модулю path.

8 мин · 3 вопросов

Открыть этот урок в Kodokon

В браузере JavaScript не имеет права трогать файлы на твоём диске: это вопрос безопасности. Node, наоборот, работает прямо на твоей машине и умеет читать и записывать файлы благодаря модулю fs (file system). Мы будем использовать его современную версию, fs/promises, у которой каждая функция возвращает промис - ты уже умеешь их дожидаться через await, знакомый по направлению JavaScript. Обрати внимание на префикс node: в импортах: он ясно показывает, что модуль поставляется самим Node, а не берётся из node_modules. И хорошая новость: в модуле ES await работает прямо на уровне файла, без окружающей функции.

JAVASCRIPT
import { writeFile } from "node:fs/promises";

await writeFile("notes.txt", "First note\n");
console.log("File created!");
writeFile создаёт файл notes.txt, если его ещё нет, с текстом, переданным вторым параметром.

Для чтения логика та же, с readFile. Его второй параметр очень важен: utf8 обозначает кодировку, то есть способ переводить байты, сохранённые на диске, в читаемый текст. Если его не указать, Node вернёт объект Buffer - сырые байты - вместо строки.

JAVASCRIPT
import { readFile } from "node:fs/promises";

const text = await readFile("notes.txt", "utf8");
console.log(text);
Содержимое файла приходит в виде строки, готовой к обработке.

Поговорим о путях. Относительный путь (notes.txt, data/log.txt) отсчитывается от текущей папки; абсолютный путь (C:\... или /home/...) начинается от корня диска. Классическая ловушка: Windows разделяет папки символом \, а macOS и Linux - символом /. Модуль path решает эту проблему: path.join собирает части с правильным разделителем, какой бы ни была система. Совместим его с mkdir, который создаёт папку.

JAVASCRIPT
import path from "node:path";
import { mkdir, writeFile } from "node:fs/promises";

const file = path.join("data", "log.txt");

await mkdir("data", { recursive: true });
await writeFile(file, "First log\n");
console.log("Written to:", file);
Опция recursive избавляет от ошибки, если папка data уже существует.

Проверка знаний

Убедись, что запомнил ключевые моменты этого урока.

  1. Что вернёт readFile, если не указать второй параметр utf8?
    • Пустую строку
    • Ошибку: кодировка обязательна
    • Buffer, то есть сырые байты файла
  2. Что делает writeFile, если целевой файл уже существует?
    • Заменяет всё существующее содержимое новым текстом
    • Добавляет новый текст в конец файла
    • Отказывается писать и выбрасывает ошибку
    • Автоматически создаёт резервную копию
  3. В чём польза path.join при построении пути?
    • Он создаёт недостающие папки пути
    • Он собирает части с правильным для системы разделителем
    • Он проверяет, что файл существует, прежде чем продолжить