2014-04-30 4 views
2

노드 js로 여러 파일을 복사하려고했습니다. 내가 소켓 오류를 걸어이Nodejs, 충돌없이 nodejs에 여러 파일을 복사하는 방법

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 Strimple advice에 비동기 모듈을 사용하기로 결정했습니다.

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 

나는 여전히 복사 어쩌면 1 00 파일 후 충돌을 갖는

내 코드는 지금이 같은 것입니다. async.whilst와 async.eachSeries는 각각의 호출이 직렬로 연결되어 있다는 것을 보여주기 때문에 오류가 발생합니다. 하지만 나는 추락했다. 나는 다음과 같이 각 사본을 기다린 후에 잠시 proble을 풀었다 :

요청 모듈의 한계가 있습니까? 프로그램을 계속하기 전에 각 연결이 닫혀 있는지 확인하기 위해이 기능을 어떻게 변경합니까?

답변

2

아마 비동기 루프로 이동해야합니다. async 모듈의 eachLimit과 같은 것이 이상적 일 수 있습니다.

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 개만 처리합니다. 이렇게하면 수백 또는 수천 개의 동시 나가는 연결이 회전하지 않습니다.

+0

안녕하세요. 귀하의 anwser 주셔서 감사합니다. 내 코드가 좀 더 복잡하기 때문에 한 가지 더 많은 정보가 필요하다. 한 번에 모든 사진을 가져올 수는 없으므로 이미 일종의 반복 작업을하고 있으며 사진 20 장을 20 장씩 가져옵니다. 그래서 asyn.eachlimit을 여러 번 호출하면 작업을 수행 할 것입니까? 아니면 전화를 직렬화하지 않을 것입니까? 미리 감사드립니다. – mcbjam

+1

처리 할 수있는 것들을 수백 가지가 넘게 처리하고 처리되는 속도를 제한하고 싶다면 eachLimit을 권장합니다. 그것은 본질적으로 당신이 시도한 것을 사진 그룹으로 나누어 대체 할 것입니다. 그룹 설정을 유지하려면 외부 루프에서 각 시리즈를 사용할 수 있습니다. 이는 첫 세트가 완료된 후에 두 번째 사진 그룹 만 처리한다는 것을 의미합니다. https://github.com/caolan/async#eachSeries –

+0

감사합니다. 나는 그것을 시도 할 것이다. – mcbjam

관련 문제