Как дописать данные в файл в Node.js
Короткий ответ
appendFile() добавляет текст в конец файла и создаёт файл, если его нет:
import { appendFile, readFile } from 'node:fs/promises';
await appendFile('visits.txt', 'Anna\n');
await appendFile('visits.txt', 'Oleg\n');
console.log(await readFile('visits.txt', 'utf8'));Результат:
Anna
OlegПростой лог
Добавляйте к каждой строке время и сообщение:
import { appendFile, readFile } from 'node:fs/promises';
const log = (message) => appendFile('app.log', `${new Date().toISOString()} ${message}\n`);
await log('Server started');
await log('User logged in');
const lines = (await readFile('app.log', 'utf8')).trim().split('\n');
console.log(lines.length, lines[1].endsWith('User logged in'));Результат:
2 trueМного записей
Для частых записей откройте поток один раз, вместо того чтобы каждый раз открывать файл:
import { createWriteStream } from 'node:fs';
import { readFile } from 'node:fs/promises';
import { once } from 'node:events';
const stream = createWriteStream('numbers.txt', { flags: 'a' });
for (let i = 1; i <= 3; i++) stream.write(`line ${i}\n`);
stream.end();
await once(stream, 'finish');
console.log(await readFile('numbers.txt', 'utf8'));Результат:
line 1
line 2
line 3Частая ошибка
appendFile() сам перевод строки не добавляет. Без \n строки слипаются:
import { appendFile, readFile } from 'node:fs/promises';
await appendFile('names.txt', 'Anna');
await appendFile('names.txt', 'Oleg');
console.log(await readFile('names.txt', 'utf8'));Результат:
AnnaOlegФункции из этого ответа
- Date.prototype.toISOString — Возвращает дату в формате ISO 8601 по UTC.