Как читать файл построчно в Node.js
Короткий ответ
Для небольших файлов прочитайте содержимое и разбейте на строки:
import { readFile, writeFile } from 'node:fs/promises';
await writeFile('names.txt', 'Anna\nOleg\nMaria\n');
const lines = (await readFile('names.txt', 'utf8')).split(/\r?\n/).filter(Boolean);
console.log(lines.length, lines[1]);Результат:
3 OlegБольшие файлы
Большой файл не стоит загружать в память целиком. readline читает его потоком, по одной строке:
import { createReadStream } from 'node:fs';
import { writeFile } from 'node:fs/promises';
import { createInterface } from 'node:readline';
await writeFile('access.log', 'GET /\nPOST /login\nGET /about\n');
const lines = createInterface({ input: createReadStream('access.log'), crlfDelay: Infinity });
let count = 0;
for await (const line of lines) {
if (line.startsWith('GET')) count++;
}
console.log('GET requests:', count);Результат:
GET requests: 2Частая ошибка
Без crlfDelay: Infinity окончание строки Windows \r\n может разделиться на два перевода строки. А forEach() у потока нет — используйте for await.
// count-lines.js
const lines = createInterface({ input: createReadStream('access.log'), crlfDelay: Infinity });
for await (const line of lines) {
console.log(line);
}Функции из этого ответа
- for await...of — Перебирает асинхронные источники данных, дожидаясь каждого элемента.
- String.prototype.split — Разбивает строку на массив по разделителю.