Skip to main content

Як записати дані у файл?

1. Асинхронний запис (через callback)

Це класичний спосіб, не блокує потік - підходить для серверів.

javascript
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-ів.

javascript
import { writeFile } from 'fs/promises'; try { await writeFile('./output.txt', 'Hello from fs/promises!'); console.log('Файл створено!'); } catch (err) { console.error('Помилка:', err); }

Можна додати опції:

javascript
await writeFile('./log.txt', 'Перший рядок\n', { flag: 'a' }); // "append"

3. Додавання (append) даних у кінець файлу

Якщо потрібно дописувати дані, а не перезаписувати:

javascript
import fs from 'fs'; fs.appendFile('./log.txt', 'Новий запис\n', (err) => { if (err) throw err; console.log('Запис додано!'); });

чи з await:

javascript
import { appendFile } from 'fs/promises'; await appendFile('./log.txt', 'Додали ще рядок\n');

4. Синхронний запис (блокуючий)

Використовується рідко (наприклад, при завантаженні конфігурацій). Блокує event loop - не рекомендується для серверних застосунків.

javascript
import fs from 'fs'; try { fs.writeFileSync('./output.txt', 'Синхронний запис'); console.log('Файл записано!'); } catch (err) { console.error(err); }

Поки файл не запишеться - виконання програми зупинено.

5. Потоковий запис (для великих файлів)

Якщо потрібно записувати багато даних (наприклад, лог чи великий JSON), краще використовувати потоки (streams).

javascript
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 приймають об'єкт налаштувань:

javascript
{ encoding: 'utf8', // кодування mode: 0o666, // права доступу до файлу flag: 'w' // режим: 'w' = запис, 'a' = додавання, 'wx' = запис, якщо файлу немає }

Приклад:

javascript
await writeFile('./data.txt', 'Test', { flag: 'a', encoding: 'utf8' });

7. Приклад: запис об'єкта в JSON-файл

javascript
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. Перевірка існування перед записом

javascript
import fs from 'fs'; if (fs.existsSync('./data.txt')) { console.log('Файл уже існує!'); } else { fs.writeFileSync('./data.txt', 'Створено новий файл'); }

Чи асинхронно:

javascript
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. Приклад "логера" (реальний кейс)

javascript
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

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.