Як записати дані у файл?
1. Асинхронний запис (через callback)
Це класичний спосіб, не блокує потік - підходить для серверів.
import fs from 'fs';
fs.writeFile('./output.txt', 'Привіт, Node.js!', (err) => {
if (err) {
console.error('Помилка запису:', err);
return;
}
console.log('Файл успішно записано!');
});- Якщо файл не існує - Node створить його.
- Якщо файл уже є - вміст перезапишеться.
- Можна передати третій параметр (
options), наприклад{ flag: 'a' }для додавання (див. нижче).
2. Асинхронний запис із промісами (fs/promises)
Сучасний, читабельний і рекомендований варіант.
Працює з async/await, без callback-ів.
import { writeFile } from 'fs/promises';
try {
await writeFile('./output.txt', 'Hello from fs/promises!');
console.log('Файл створено!');
} catch (err) {
console.error('Помилка:', err);
}Можна додати опції:
await writeFile('./log.txt', 'Перший рядок\n', { flag: 'a' }); // "append"3. Додавання (append) даних у кінець файлу
Якщо потрібно дописувати дані, а не перезаписувати:
import fs from 'fs';
fs.appendFile('./log.txt', 'Новий запис\n', (err) => {
if (err) throw err;
console.log('Запис додано!');
});чи з await:
import { appendFile } from 'fs/promises';
await appendFile('./log.txt', 'Додали ще рядок\n');4. Синхронний запис (блокуючий)
Використовується рідко (наприклад, при завантаженні конфігурацій). Блокує event loop - не рекомендується для серверних застосунків.
import fs from 'fs';
try {
fs.writeFileSync('./output.txt', 'Синхронний запис');
console.log('Файл записано!');
} catch (err) {
console.error(err);
}Поки файл не запишеться - виконання програми зупинено.
5. Потоковий запис (для великих файлів)
Якщо потрібно записувати багато даних (наприклад, лог чи великий JSON),
краще використовувати потоки (streams).
import fs from 'fs';
const stream = fs.createWriteStream('./bigdata.txt');
stream.write('Перший рядок\n');
stream.write('Другий рядок\n');
stream.end('Файл завершено!\n');
stream.on('finish', () => console.log('Запис завершено!'));
stream.on('error', (err) => console.error('Помилка:', err));Переваги потоків:
- Запис іде частинами, не завантажуючи всю пам'ять;
- Можна використовувати для стримінгу HTTP-відповідей чи логування.
6. Параметри запису (options)
Методи writeFile, appendFile, createWriteStream приймають об'єкт налаштувань:
{
encoding: 'utf8', // кодування
mode: 0o666, // права доступу до файлу
flag: 'w' // режим: 'w' = запис, 'a' = додавання, 'wx' = запис, якщо файлу немає
}Приклад:
await writeFile('./data.txt', 'Test', { flag: 'a', encoding: 'utf8' });7. Приклад: запис об'єкта в JSON-файл
import { writeFile } from 'fs/promises';
const user = { name: 'Tim', age: 28 };
await writeFile('./user.json', JSON.stringify(user, null, 2));
console.log('JSON збережено!');JSON.stringify(..., null, 2)робить гарний формат із відступами.- Якщо потрібно оновити - читай файл → парси → онови → знову
writeFile.
8. Перевірка існування перед записом
import fs from 'fs';
if (fs.existsSync('./data.txt')) {
console.log('Файл уже існує!');
} else {
fs.writeFileSync('./data.txt', 'Створено новий файл');
}Чи асинхронно:
import { access, writeFile } from 'fs/promises';
import { constants } from 'fs';
try {
await access('./data.txt', constants.F_OK);
console.log('Файл уже є');
} catch {
await writeFile('./data.txt', 'Створено автоматично');
}9. Приклад "логера" (реальний кейс)
import { appendFile } from 'fs/promises';
async function log(message) {
const timestamp = new Date().toISOString();
await appendFile('./server.log', `[${timestamp}] ${message}\n`);
}
await log('Сервер запущено');
await log('Користувач увійшов');Відмінно підходить для ведення логів без бібліотек.
10. Зведена таблиця
| Метод | Асинхронність | Перезаписує | Додає | Потоковий | Рекомендується |
|---|---|---|---|---|---|
fs.writeFile | Так | Так | Ні | Ні | Так |
fs/promises.writeFile | Так (await) | Так | Ні | Ні | Так, найкраще |
fs.appendFile | Так | Ні | Так | Ні | Так |
fs.createWriteStream | Так | Налаштовується | Так | Так | Так (великі дані) |
fs.writeFileSync | Ні | Так | Ні | Ні | Лише для CLI |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.