2014-07-12 3 views
1

노드에 명령 줄 스크립트를 작성하고 있습니다. 왜냐하면 JS를 알고 Bash에서 빨아 들여야하고 DOM을 탐색하기 위해 jQuery가 필요합니다 ...) 지금은 입력 파일을 만들고 각 행을 반복합니다.NodeJS의 루프 내에서 HTTP 요청을 만드는 방법

jQuery로 결과 문자열을로드하고 각 페이지에서 필요한 정보를 추출 할 수 있도록 한 줄에 하나의 HTTP 요청 (GET)을 만들려면 어떻게해야합니까? NPM httpsync 패키지를 사용해 보았습니다. 입력 파일의 줄마다 하나의 GET 호출을 차단할 수는 있지만 HTTPS는 지원하지 않습니다. 만 HTTPS를 지원합니다.

감사합니다.

+0

죄송하지만 왜 – Mritunjay

+0

나는 종류의 차단에 대해 마음에 의해 변경했습니다 ...하지만 차단은 간단 요청의 거대한 숫자를 생성 할 수 있습니다 .. 특별히 전화를 차단. 잠재적으로 1000 개 이상의 라인 파일을로드하고 있으므로 스크립트를 차단하지 않으면 많은 수의 병렬 요청이 생성됩니다. 스로틀 링은 작동 할 수 있지만 내 머리를 감쌀 수는 없습니다 ATM – Oli

답변

0

일종의 조절/동시 연결 수를 제한하지 않고 백만 건의 동시 요청이 이루어질 까봐 걱정되었지만 Node가 나를 5 ~ 6 개의 동시 연결에 대해 "즉시 사용할 수있는"것으로 조절하는 것처럼 보입니다. .

노드의 고유 한 비동기 성을 완전히 활용하는 동시에 코드를 훨씬 간단하게 유지할 수 있기 때문에 완벽합니다.

+0

스로틀 링을 수행하는 것은 [HTTP'Agent'] (http://nodejs.org/api/http.html#http_class_http_agent)입니다 (http .globalAgent.maxSockets', 디폴트는'5')이지만 노드 0.12에는 기본 제한이 없다는 경고를받습니다. – josh3736

5

많은 수의 작업을 처리하는 좋은 방법은 async queue입니다.

HTTP 요청의 경우 request을, HTML을 처리하는 경우 cheerio을 참조하시기 바랍니다.

var q = async.queue(function (task, done) { 
    request(task.url, function(err, res, body) { 
     if (err) return done(err); 
     if (res.statusCode != 200) return done(res.statusCode); 

     var $ = cheerio.load(body); 
     // ... 
     done(); 
    }); 
}, 5); 

그런 다음 큐에 모든 URL을 추가 :

q.push({ url: 'https://www.example.com/some/url' }); 
// ... 
+0

요청과 치어 리오는 정확히 내가 실제로 사용하게 된 것입니다. – Oli

+0

별도로, 비동기 큐가 요청보다 낫고 + 답장에 주석으로 언급 한 구성이 왜 더 좋습니까? – Oli

1

내가 가장 가능성이 비동기 라이브러리의 기능 eachLimit 기능을 사용

함께 이러한 퍼팅, 당신은 뭔가를 얻을. 그러면 모든 작업이 완료 될 때 콜백을받을뿐만 아니라 활성 연결 수를 제한 할 수 있습니다.

async.eachLimit(urls, function(url, done) { 
    request(url, function(err, res, body) { 
     // do something 
     done(); 
    }); 
}, 5, function(err) { 
    // do something 
    console.log('all done!'); 
}) 
관련 문제