Nodejs,如何复制nodejs中的几个文件,而不会崩溃

我试图用节点js复制几个文件。

这是我想要做的一个例子:

var request = require('request'); va photos [{ 'url': 'http://xxxx.com/im1', 'name' : 'name1' }, { 'url': 'http://xxxx.com/im12', 'name' : 'name2' }, for (var i = 0; i < photos.length; i++) { request(photos[i].source).pipe(fs.createWriteStream(photos[i].name)); } 

也许1000电话后,我有一个套接字挂出错误。

继@Timothy Strimplebuild议我决定使用asynchronous模块。

我的代码现在是这样的:

 async.whilst(function () { return !stop; }, function (callback) { console.log("get next 20 image"); JM.api('/' + album.id + '/photos', { after: next }, function (resf) { if (!resf || resf.error) { console.log(!resf ? 'error occurred' : resf.error); } console.log("albums" + album.id + " " + resf.data.length + " dir" + dir); async.eachSeries(resf.data, function (photo, done) { request(photo.source).pipe(fs.createWriteStream(dir + "/" +photo.name)); console.log("copy of image " + img_basename); }, function (err) { if (err) { console.log('An images failed to copy'); } else { console.log('All 20 image have been copied successfully'); } if (resf.paging && resf.paging.cursors) { console.log("suite de l'album à venir"); next = resf.paging.cursors.after; setTimeout(function () { callback(); }, 5000); } else { console.log("Fin de l'album"); stop = true; setTimeout(function () { callback(); }, 5000); } }); }); }, function (err) { if (err) { console.log('An images failed to process'); albumcallback(); } else { console.log('All images in this group have been processed successfully'); albumcallback(); } } );// end while 

在复制了100个文件后,我仍然崩溃。 我敢肯定,async.whilst和async.eachSeries是weel,因为我的日志显示,每个电话是串联。 但我有一个崩溃。 我临时解决了这个问题,在每个副本之后加上一个等待,就像这样:

 request(photo.source).pipe(fs.createWriteStream(dir + "/" + img_basename)); console.log("copy of image " + img_basename); setTimeout(function () { done(); }, 5000); 

这是请求模块的限制吗? 如何改变这个fea线,以确保在连接程序之前closures每个连接?

您可能需要移至asynchronous循环。 类似于asynchronous模块中的每个限制可能是理想的。

 async.eachLimit(photos, 10, function(photo, done) { var r = request(photos[i].source).pipe(fs.createWriteStream(photos[i].name)); r.on('finish', done); }, function(err) { // All images done or there was an error }); 

现在它会处理您的照片列表中的所有项目,但它只会同时处理其中的10个项目。 这将防止它跳出数百或数千个并发传出连接。

请求调用和pipe道调用是asynchronous的。 所以我不得不重写这一行:请求(照片[i] .source).pipe(fs.createWriteStream(photos [i] .name));

看到这里: 同步使用Node.js下载N个远程文件

Interesting Posts