Мне нужно направить читаемый поток как в буфер (для преобразования в строку), так и в файл. Поток исходит от node-fetch
.
Потоки NodeJS имеют два состояния: приостановлено и выполняется. Насколько я понимаю, как только будет подключен слушатель 'data'
, поток перейдет в непрерывный режим. Я хочу убедиться, что то, как я читаю поток, не потеряет ни одного байта.
Способ 1: передача и чтение из 'data'
:
fetch(url).then(
response =>
new Promise(resolve => {
const buffers = []
const dest = fs.createWriteStream(filename)
response.body.pipe(dest)
response.body.on('data', chunk => buffers.push(chunk))
dest.on('close', () => resolve(Buffer.concat(buffers).toString())
})
)
Способ 2: использование сквозных потоков:
const { PassThrough } = require('stream')
fetch(url).then(
response =>
new Promise(resolve => {
const buffers = []
const dest = fs.createWriteStream(filename)
const forFile = new PassThrough()
const forBuffer = new PassThrough()
response.body.pipe(forFile).pipe(dest)
response.body.pipe(forBuffer)
forBuffer.on('data', chunk => buffers.push(chunk))
dest.on('close', () => resolve(Buffer.concat(buffers).toString())
})
)
Требуется ли второй метод, чтобы не было потерянных данных? Является ли второй метод расточительным, поскольку можно буферизовать еще два потока? Или есть другой способ одновременно заполнить буфер и записать поток?
read
в своем собственном темпе (вытягивание), и я также читал, что слушатель «данных» заставит пар течь постоянно (нажимая) - person andykais   schedule 17.07.2018fs.writeFile()
, если вы собираетесь сначала прочитать весь файл в память. Нет необходимости.pipe()
это. Если вам не нужен весь файл в памяти, то.pipe()
более эффективен. - person jfriend00   schedule 17.07.2018