在 Node 中下载远程文件 URL 数组的最有效方法?

Most efficient way to download array of remote file URLs in Node?

我正在开发一个 Node 项目,其中有一组文件,例如

var urls = ["http://web.site/file1.iso", "https://web.site/file2.pdf", "https://web.site/file3.docx", ...];

我希望以最有效的方式将这些文件下载到本地。这个数组中可能有几十个 URL...有没有一个好的库可以帮助我抽象出来?我需要一些我可以用数组调用的东西和所需的本地目录,它将遵循重定向、使用 http 和 https、智能地限制同时下载等。

node-fetch 是一个可爱的小库,它为节点带来了 fetch 能力。由于 fetch returns 一个承诺,管理并行下载很简单。这是一个例子:

const fetch = require('node-fetch')
const fs = require('fs')

// You can expand this array to include urls are required
const urls = ['http://web.site/file1.iso', 'https://web.site/file2.pdf']

// Here we map the list of urls -> a list of fetch requests
const requests = urls.map(fetch)

// Now we wait for all the requests to resolve and then save them locally
Promise.all(requests).then(files => {
  files.forEach(file => {
    file.body.pipe(fs.createWriteStream('PATH/FILE_NAME.EXT'))
  })
})

或者,您可以在解析时编写每个文件:

const fetch = require('node-fetch')
const fs = require('fs')

const urls = ['http://web.site/file1.iso', 'https://web.site/file2.pdf']

urls.map(file => {
  fetch(file).then(response => {
    response.body.pipe(fs.createWriteStream('DIRECTORY_NAME/' + file))
  })
})