如何在不等待获取结束的情况下将响应写入流?

问题描述 投票:0回答:1

我需要获取音频文件并写入目录。我担心我必须等待获取结束才能下载所有文件,然后写入/保存到文件。是否可以获取音频文件并同时写入文件。我只是觉得它可能像“管道”。从服务获取块,不要等待获取过程结束,只需将刚刚下载的块写入文件。那可能吗?如果是的话,可以举个例子吗?

这是我的代码:


const fetchAndWriteFiles = async (url, path) => {
  const res = await fetch(url)

  const fileStream = fs.createWriteStream(path)
  await new Promise((resolve, reject) => {
    res.body.pipe(fileStream)
    res.body.on('error', err => {
      reject(err)
    })
    fileStream.on('finish', function () {
      resolve()
    })
  })
}

javascript node.js stream node-fetch
1个回答
2
投票

await fetch()
不会下载整个文件(如果文件很大)。它读取文件的第一个块(在我在调试器中查看的示例中,第一个块的长度为 16384 字节),从中提取标头,然后将第一个块的其余部分留在流中等待读出.

执行

.pipe()
并且现有流被清空后,将读取文件的后续部分。文件的其余部分将以块的形式读取并以块的形式写入磁盘。要测试这一点,您必须使用足够大的文件,以至于需要多个块来读取/写入它。

事实上,当我在下载更大的响应时进行检测时,我看到在

await fetch()
完成后发生了多次读取和写入。

因此,您的代码似乎已经在执行您似乎感兴趣的操作。如果您正在下载的页面很小(适合一个缓冲区),您将不会看到多次读取/写入,因为整个响应可能会一次性读取,但对于较大的响应,它肯定会分块读取。块的大小还可能取决于数据从源到达的速度。

© www.soinside.com 2019 - 2024. All rights reserved.