Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Работа с папками

Файлы проекта удобно раскладывать по папкам: статьи в 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 });

Тогда второй и последующие запуски пройдут без ошибок.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.