如何解决如何通过Request或HTTP使用Node.js在foreach循环中下载文件?
我有一个字符串数组,这些字符串是指向要从中下载内容的URL的链接。 downloadLinks数组如下所示:
['stackoverFlow.com/File0','stackoverFlow.com/File1','stackoverFlow.com/File2']
。
这是我用来尝试下载这些文件的代码。同时使用Request和HTTPS.get
的示例代码var fs = require ('fs');
var sleep = require('sleep');
var https = require('https');
var request = require('request')
// Using Request:
var uniqueDownloadLinks = [ ...new Set(downloadLinks)]
for (downloadLink in uniqueDownloadLinks) {
const download = (url,callback) => {
request.head(url,(err,response,body) => {
var file = fs.createWriteStream(dest);
var dest = 'files/' + response.headers['content-disposition'].toLowerCase().split('filename=')[1].split(';')[0].replace(/"/g,'');
request(url)
.pipe(file)
.on('close',callback)
})
}
download(uniqueDownloadLinks[downloadLink],() => {
console.log('fileDownloaded')
})
sleep.sleep(5);
}
// Using HTTPS.get
var uniqueDownloadLinks = [ ...new Set(downloadLinks)]
for (downloadLink in uniqueDownloadLinks) {
var download = function(url) {
var request = https.get(url,function(response) {
var dest = 'files/' + response.headers['content-disposition'].toLowerCase().split('filename=')[1].split(';')[0].replace(/"/g,'');
var file = fs.createWriteStream(dest);
response.pipe(file);
file.on('finish',function() {
file.close();
});
});
download(downloadLink);
sleep.sleep(5);
}
我已经在test.js文件中的foreach循环之外测试了此代码,其中仅包括下载文件的代码,并且该代码有效。文件输出,一切顺利。当我尝试使用foreach循环下载时,我什么也不下载。我怀疑这与尝试在foreach循环中进行下载有关,但是由于从未输入请求代码(例如,尝试使用console.log(dest)
来输出目标+文件名),因此很难调试出问题所在从内容处置标题开始。
我应该怎么做才能遍历链接数组并下载每个文件?
解决方法
由于Estus Flask的评论,我调查了使用睡眠的问题,并确定他对“睡眠很糟”的评估是正确的。
此问题的解决方法包括使下载功能异步并使用诺言来处理5秒钟的睡眠。
async function sleep(milliseconds) {
return new Promise(resolve => setTimeout(resolve,milliseconds));
}
await sleep(5000)
const $ = await download(uniqueDownloadLinks[downloadLink],() => {
console.log('fileDownloaded')
})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。