Потоки записи в Node.js — практическое руководство
Node.js предоставляет мощную абстракцию ввода-вывода — Streams (потоки), которые позволяют эффективно обрабатывать данные частями, особенно когда речь идёт о больших объёмах данных. В этом руководстве мы сосредоточимся на Writable Streams — потоках, в которые можно записывать данные.
Что такое Writable Stream?
Writable Stream — это абстракция для источника данных, в который можно записывать. Примеры:
- fs.createWriteStream() — запись в файл
- http.request() — отправка HTTP-запросов
- net. Socket — запись в TCP-сокет
- process.stdout — вывод в консоль
Основные методы и события
Метод .write(chunk, [encoding], [callback])
Используется для записи данных в поток. Возвращает true, если поток готов принять ещё данные, иначе — false.
const fs = require('fs');
const stream = fs.createWriteStream('output.txt');
const result = stream.write('Hello, world!');
console.log(result); // true или false
Метод .end([chunk], [encoding], [callback])
Завершает поток. При необходимости можно передать финальный кусок данных.
stream.end('Final data');
События
- drain — вызывается, когда поток снова готов к записи (если ранее вернул false).
- finish — вызывается после завершения записи (после .end()).
- error — при возникновении ошибки.
stream.on('finish', () => console.log('Запись завершена.'));
stream.on('error', err => console.error('Ошибка:', err));
Управление потоком вручную
Когда stream.write() возвращает false, это означает, что внутренний буфер переполнен. Чтобы избежать перегрузки, стоит дождаться события drain:
function writeMany(stream, data, times) {
let i = 0;
function write() {
while (i < times) {
const ok = stream.write(data);
if (!ok) {
stream.once('drain', write);
return;
}
i++;
}
stream.end();
}
write();
}
writeMany(fs.createWriteStream('big.txt'), 'data\n', 10000);
Пользовательские Writable Streams
Вы можете создать свой Writable Stream, расширив Writable из модуля stream:
const { Writable } = require('stream');
class Logger extends Writable {
_write(chunk, encoding, callback) {
console.log(`LOG: ${chunk.toString()}`);
callback();
}
}
const logger = new Logger();
logger.write('Hello\n');
logger.end('Bye\n');
Итого
Writable Streams — ключевой инструмент в Node.js для эффективной записи данных. Они позволяют управлять потоком, обрабатывать ошибки и даже создавать свои реализации.
https://pavel-romanov.com/writable-streams-in-nodejs-a-practical-guide
✍️