Як створити директорію через Node.js?
1. Асинхронне створення папки (через callback)
Класичний спосіб:
import fs from 'fs';
fs.mkdir('./uploads', (err) => {
if (err) {
console.error('Помилка під час створення папки:', err);
return;
}
console.log('Папку створено!');
});- Якщо папка вже існує → буде помилка
EEXIST; - Цей метод не блокує event loop, безпечний для серверів.
2. Сучасний спосіб (через fs/promises і await)
Найзручніший і найсучасніший варіант - з промісами й async/await:
import { mkdir } from 'fs/promises';
try {
await mkdir('./uploads');
console.log('Папку створено!');
} catch (err) {
if (err.code === 'EEXIST') {
console.log('Папка вже існує.');
} else {
console.error('Помилка:', err);
}
}- Асинхронно, чисто й без callback-ів;
- Рекомендується для всіх сучасних версій Node.js (v14+).
3. Створення вкладених директорій (рекурсивно)
Якщо потрібно створити вкладені папки, наприклад:
uploads/images/2025/januaryПросто додай прапорець { recursive: true }:
import { mkdir } from 'fs/promises';
await mkdir('./uploads/images/2025/january', { recursive: true });
console.log('Вкладені папки створено!');- Node сам створить усі відсутні рівні;
- Якщо директорія вже є - помилки не буде.
Це аналог команди в Linux:
mkdir -p uploads/images/2025/january4. Синхронний спосіб (блокуючий)
Якщо ти створюєш папки при старті скрипта (наприклад, для логів чи конфігурацій):
import fs from 'fs';
try {
fs.mkdirSync('./uploads');
console.log('Папку створено!');
} catch (err) {
if (err.code === 'EEXIST') {
console.log('Уже існує.');
} else {
console.error('Помилка:', err);
}
}- Працює миттєво, але блокує event loop.
- Не рекомендується для серверних застосунків, лише для setup-скриптів.
5. Перевірка існування перед створенням
Можна перевірити наявність папки заздалегідь:
import fs from 'fs';
if (!fs.existsSync('./uploads')) {
fs.mkdirSync('./uploads');
console.log('Папку створено!');
} else {
console.log('Папка вже є.');
}Але в нових версіях Node краще просто використовувати { recursive: true } - перевірка не потрібна.
6. Права доступу (mode)
Параметр mode задає права доступу до папки (у UNIX-правах):
await mkdir('./secure', { mode: 0o700 });0o777- усі користувачі можуть читати/писати/виконувати;0o700- тільки власник;- За замовчуванням Node успадковує системні права.
7. Видалення й пересоздання (приклад)
Якщо потрібно очистити директорію перед пересозданням:
import { rm, mkdir } from 'fs/promises';
await rm('./uploads', { recursive: true, force: true });
await mkdir('./uploads');
console.log('Папку пересоздано!');8. Обробка типових помилок
| Код помилки | Причина | Рішення |
|---|---|---|
EEXIST | Папка вже є | Використати { recursive: true } |
ENOENT | Батьківської папки не існує | Використати { recursive: true } |
EACCES | Немає прав на створення | Перевірити права доступу |
EPERM | Системна заборона (Windows) | Запуск від імені адміністратора |
9. Приклад - створення структури проєкту
import { mkdir } from 'fs/promises';
const dirs = ['logs', 'data/uploads', 'data/backups'];
for (const dir of dirs) {
await mkdir(dir, { recursive: true });
console.log(`${dir} створено`);
}Це створить потрібну структуру автоматично, навіть якщо частина папок відсутня.
10. Коротке резюме
| Метод | Асинхронність | Створює вкладені | Рекомендується |
|---|---|---|---|
fs.mkdir() | Так (callback) | Ні | Старий стиль |
fs.promises.mkdir() | Так (await) | Так ({ recursive: true }) | Сучасний |
fs.mkdirSync() | Ні | Ні | Лише для CLI |
fs.mkdirSync(..., { recursive: true }) | Ні | Так | При ініціалізації |
Одним реченням
Щоб створити папку в Node.js, використовуй
await fs.promises.mkdir('шлях', { recursive: true })- це безпечно, сучасно, не блокує потік і автоматично створює вкладені директорії.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.