Работа с папками
Файлы проекта удобно раскладывать по папкам: статьи в data/posts, загруженные картинки в uploads. В модуле node:fs/promises есть функции, которые создают папки, перечисляют их содержимое и удаляют их.
Создание папки
mkdir() создаёт папку. С параметром recursive: true она создаст и все недостающие родительские папки, а если папка уже есть — просто ничего не сделает:
import { mkdir, stat } from 'node:fs/promises';
await mkdir('data/posts', { recursive: true });
console.log((await stat('data/posts')).isDirectory()); // trueРядом с программой появятся папки data и вложенная в неё posts.
Список файлов
readdir() возвращает массив имён того, что лежит в папке:
import { mkdir, readdir, writeFile } from 'node:fs/promises';
await mkdir('data/posts', { recursive: true });
await writeFile('data/posts/hello.md', '# Привет');
await writeFile('data/posts/files.md', '# Файлы');
const names = await readdir('data/posts');
console.log(names.sort()); // [ 'files.md', 'hello.md' ]Порядок имён зависит от системы, поэтому для вывода список отсортирован.
Файлы и папки
С параметром withFileTypes: true вместо строк приходят объекты, которые знают, файл это или папка:
import { mkdir, readdir, writeFile } from 'node:fs/promises';
await mkdir('data/posts', { recursive: true });
await mkdir('data/images', { recursive: true });
await writeFile('data/posts.json', '[]');
const entries = await readdir('data', { withFileTypes: true });
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
console.log(entry.isDirectory() ? 'папка' : 'файл ', entry.name);
}Выведется «папка images», «папка posts» и «файл posts.json».
Только нужные файлы
Отобрать файлы по расширению помогает path.extname():
import path from 'node:path';
import { mkdir, readdir, writeFile } from 'node:fs/promises';
await mkdir('drafts', { recursive: true });
await writeFile('drafts/a.md', 'A');
await writeFile('drafts/notes.txt', 'B');
const posts = (await readdir('drafts')).filter((name) => path.extname(name) === '.md');
console.log(posts); // [ 'a.md' ]Удаление и перенос
| Функция | Что делает |
|---|---|
mkdir(dir, { recursive: true }) | Создаёт папку со всеми родителями |
readdir(dir) | Список имён |
rename(from, to) | Переименовывает или переносит папку |
rm(dir, { recursive: true, force: true }) | Удаляет папку со всем содержимым |
Будьте осторожны с rm(): удалённое не попадает в корзину.
Частая ошибка
Без recursive: true функция mkdir() падает в двух случаях: если папка уже существует (ошибка EEXIST) и если нет родительской папки (ошибка ENOENT). Поэтому при запуске сервера, который создаёт папку для данных, параметр нужен всегда:
// src/server.js
import { mkdir } from 'node:fs/promises';
await mkdir('data', { recursive: true });Тогда второй и последующие запуски пройдут без ошибок.