Как считать stream.Readable в buffer?
Вот сам поток:
Задача - считать его в буфер (про наличие библиотек знаю, хочется понимать саму суть).
Пытался так:
let body;
steam.on('data', (chunk) => {
debugger
body += chunk;
});
Debugger не работает.
Ответы (1 шт):
Судя по картинке, вопрос про чтение stream.Readable
Как его прочитать
const chunks = [];
stream.on('data', (x) => chunks.push(x));
stream.on('end', () => {
// закончилось чтение потока
// можем склеить все чанки (они тоже буфер) в один буфер
// и что-то с ним сделать
const buf = Buffer.concat(chunks);
}
Что важно не забывать?
Во время работы с потоком возможны ошибки, обрывы, закрытия потока. Нужно писать обработчики на close, error.
Как завернуть чтение буфера в асинхронную функцию?
Способ 1 - Consuming readable streams with async iterators
With the support of async generators and iterators in JavaScript, async generators are effectively a first-class language-level stream construct at this point
const fs = require('fs');
const path = require('path');
(async () => {
const stream = fs.createReadStream(path.join(__dirname, './csv/8.csv'));
const chunks = [];
for await (const chunk of stream) {
chunks.push(chunk);
}
const buffer = Buffer.concat(chunks);
console.log(`bufferLength=${buffer.length}`);
stream.close();
})();
Async iterators register a permanent error handler on the stream to prevent any unhandled post-destroy errors.
Способ 2
// @ts-check
const fs = require('fs');
const path = require('path');
(async () => {
const stream = fs.createReadStream(path.join(__dirname, './csv/8.csv'));
/** @type {Buffer} */
const buffer = await new Promise((resolve, reject) => {
const chunks = [];
stream.on('data', (x) => chunks.push(x));
stream.on('end', () => resolve(Buffer.concat(chunks)));
stream.on('error', reject);
stream.on('close', reject);
});
console.log(`bufferLength=${buffer.length}`);
})();
$ ls -la src/csv-stream/csv/8.csv
-rw-r--r-- 1 x staff 5683264 7 окт 02:01 src/csv-stream/csv/8.csv
$ node src/csv-stream/read.js
bufferLength=5683264
