Javascript 使用节点js和循环从web下载文件
我想使用以下代码从web下载多个文件:Javascript 使用节点js和循环从web下载文件,javascript,node.js,Javascript,Node.js,我想使用以下代码从web下载多个文件: var fs = require('fs'); var http = require('http'); var request = require('request'); var file; for(var i = 1; i <= 5; i++) { //CHECK IF REMOTE FILE EXISTS request('http://webaddress.com/f
var fs = require('fs');
var http = require('http');
var request = require('request');
var file;
for(var i = 1; i <= 5; i++) {
//CHECK IF REMOTE FILE EXISTS
request('http://webaddress.com/filename' + i + '.jar', function (err, resp) {
//IF EXISTS DO
if (resp.statusCode == 200) {
//DOWNLOAD DATA AND CREATE A NEW .JAR FILE
file = fs.createWriteStream('D:\\filename' + i + '.jar');
http.get('http://webaddress.com/filename' + i + '.jar', function(response) {
response.pipe(file);
file.on('finish', function() {
file.close();
});
});
}
//FILE DOES NOT EXIST
});
}
var fs=require('fs');
var http=require('http');
var请求=要求(“请求”);
var文件;
对于(var i=1;i您的请求是异步的,它将仅在循环完成后执行,因此文件名中的5
。解决方案是通过创建新函数并在循环内调用它来单独威胁代码:
var fs = require('fs');
var http = require('http');
var request = require('request');
var file;
function customRequest(i){
//CHECK IF REMOTE FILE EXISTS
return request('http://webaddress.com/filename' + i + '.jar', function(err, resp) {
//IF EXISTS DO
if (resp.statusCode == 200) {
//DOWNLOAD DATA AND CREATE A NEW .JAR FILE
file = fs.createWriteStream('D:\\filename' + i + '.jar');
http.get('http://webaddress.com/filename' + i + '.jar', function(response) {
response.pipe(file);
file.on('finish', function() {
file.close();
});
});
}
//FILE DOES NOT EXIST
});
}
for (var i = 1; i <= 5; i++) {
customRequest(i)
}
var fs=require('fs');
var http=require('http');
var请求=要求(“请求”);
var文件;
功能定制请求(一){
//检查远程文件是否存在
返回请求('http://webaddress.com/filename“+i+”.jar',函数(err,resp){
//如果存在,你会做什么
如果(响应状态代码==200){
//下载数据并创建一个新的.JAR文件
file=fs.createWriteStream('D:\\filename'+i+'.jar');
http.get('http://webaddress.com/filename“+i+”.jar',函数(响应){
管道(文件);
on('finish',function(){
file.close();
});
});
}
//文件不存在
});
}
对于(var i=1;iLike@Ionut说您的请求是异步的,所以您需要等待它
let fs = require('fs');
let request = require('request');
let download = (uri, filename) => {
return new Promise ((resolve, reject) => {
request.head(uri, function(err, res) {
if (res.statusCode === 200) {
request(uri).pipe(fs.createWriteStream(filename)).on('close', resolve);
} else {
reject(res.statusCode);
}
});
});
};
let promises = [];
for(let i = 1; i <= 5; i++) {
promises.push(download('http://webaddress.com/filename' + i + '.jar', 'D:\\filename' + i + '.jar'));
}
Promise.all(promises).then(() => {
process.exit(0);
});
让fs=require('fs');
let request=require('request');
让下载=(uri,文件名)=>{
返回新承诺((解决、拒绝)=>{
head(uri,函数(err,res){
如果(res.statusCode==200){
请求(uri).pipe(fs.createWriteStream(filename)).on('close',resolve);
}否则{
拒绝(res.statusCode);
}
});
});
};
让承诺=[];
for(设i=1;i{
进程退出(0);
});
您的请求是异步的,只有在循环完成后才会执行,因此文件名中出现了5
。我怀疑是这样。谢谢。我能做些什么来让它工作呢?看到这个答案,它可以帮您解决问题。谢谢@LucasDuarte,我会检查它。@lupu51nfactumN778,我已经为您添加了一个答案。谢谢,您的代码没有问题ke 5个独立的文件。我现在的问题是,所有数据只进入一个随机文件,其他文件是空的。这可能是函数执行太快了吗?我尝试了setTimeout,但运气不好。