Javascript 如何使用Fetch API下载和保存文件?(Node.js)

Javascript 如何使用Fetch API下载和保存文件?(Node.js),javascript,node.js,xmlhttprequest,fetch,fetch-api,Javascript,Node.js,Xmlhttprequest,Fetch,Fetch Api,我有一个可能很大(100+Mb)文件的url,如何使用fetch将其保存在本地目录中 我环顾四周,但似乎没有太多关于如何做到这一点的资源/教程 谢谢大家! 使用Fetch API,您可以编写一个函数,从URL下载,如下所示: const downloadFile = (async (url, path) => { const res = await fetch(url); const fileStream = fs.createWriteStream(path); await

我有一个可能很大(100+Mb)文件的url,如何使用fetch将其保存在本地目录中

我环顾四周,但似乎没有太多关于如何做到这一点的资源/教程


谢谢大家!

使用Fetch API,您可以编写一个函数,从URL下载,如下所示:

const downloadFile = (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", reject);
      fileStream.on("finish", resolve);
    });
});

如果您希望避免像另一个非常好的答案中那样明确做出承诺,并且可以为整个100+MB文件构建缓冲区,那么您可以做一些更简单的事情:

const fetch = require('node-fetch');
const {writeFile} = require('fs');
const {promisify} = require('util');
const writeFilePromise = promisify(writeFile);

function downloadFile(url, outputPath) {
  return fetch(url)
      .then(x => x.arrayBuffer())
      .then(x => writeFilePromise(outputPath, Buffer.from(x)));
}
但是另一个答案将更加高效,因为它将接收到的数据流直接传输到一个文件中,而无需在缓冲区中累积所有数据流。

const{createWriteStream}=require('fs');
const{pipeline}=require('stream');
const{promisify}=require('util');
const fetch=require('node-fetch');
const downloadFile=async(url,路径)=>promisify(管道)(
(等待获取(url)).body,
createWriteStream(路径)
);

Node.js没有集成Fetch。为什么要进行Fetch?Node支持http?我正在创建一个Electron应用程序,支持fetch。为什么要使用fetch而不是纯http,因为它更容易使用(或者说目前为止似乎是这样)。如果有人想用fetch api在浏览器中保存文件(并找到了这个答案),那么请看这里:您甚至可以通过编写
res.body.on('error',reject)来缩短文件的长度
fileStream.on('finish',resolve)
.I get error
TypeError:无法读取destroyer(internal/streams/pipeline.js:23:10)上未定义的属性“on”