2013-10-24 2 views
1

URL 배열이 있다고 가정하고 각 URL이 작동하는지 확인하려면 다음 코드를 작성해야합니다. 그러나 배열의 마지막 URL 만 테스트됩니다. 각 URL이 200 응답 코드를 반환하도록하려면 어떻게해야합니까? 분명히하기 위해 내가 테스트하고있는 모든 원격 주소이며 그들은 상당히 크기가 조정 된 PDF를 가리 킵니다.Node.js로 URL 테스트

@ lukas.pukenis의 응답을 기반으로 업데이트되었습니다. 결과는 비슷하지만 실제로 몇 개의 파일 만 검사됩니다.

function check(l) { 
    console.log(l); 

    http.get(l, function(res) { 
     if (res.statusCode != 200) { 
      console.log(res.statusCode + ' on '+l); 
     } else { 
      console.log('success on ' + l); 
     } 
    }); 
} 

for (link in fileLinks) { 
    check(fileLinks[link]); 
} 

이 코드 출력 : 루프가 L 변수를 var l = fileLinks[link];

그래서 L 배열의 마지막 값의 값이 각각 시간 재기록 때문에

http://somesite.com/somefile1.pdf 
http://somesite.com/somefile2.pdf 
http://somesite.com/somefile3.pdf 
... 
all the rest of them 
... 
http://somesite.com/somefile99.pdf 
success on http://somesite.com/somefile1.pdf 
success on http://somesite.com/somefile2.pdf 
404 on http://somesite.com/somefile5.pdf 
success on http://somesite.com/somefile7.pdf 
+1

'fileLinks' 배열이면 통해 루프로 사용되는 '.forEach (함수 (항목) {})'대신에 'for'의 기능을 사용하려고 자바 스크립트 객체의 다양한 키. 배열과 함께 사용되는 것은 아닙니다. – Jondlm

답변

1

이있다. 고유 한 l 값을 보존하려면 어딘가에 저장해야합니다. 더 나은 기능. 이와 같이 :

function check(l) { 
    var req = http.get(l, function(res) { 
    if (res.statusCode != 200) { 
     console.log(res.statusCode + ' on '+l); 
    } else { 
     console.log('success on ' + l); 
    } 
    } 

    req.on('close', function() { 
    console.log('Request done'); 
    }); 

for (link in fileLinks) { 
    var l = fileLinks[link]; 
    check(l); 
} 

기능을 갖는 것은 여기서 마술이 아닙니다. 각 함수 호출에 대해 로컬 값을 메모리에 보존하기 때문에 l은 필요할 때마다 고유합니다.

+0

감사합니다. Lukas. 이것은 도움이되었지만 여전히 문제를 해결하지 못했습니다. 제안 된 수정 사항을 반영하도록 질문을 업데이트했습니다. – jjr2527

+0

어레이가 반복적으로 반복되는지 확신합니까? for..in 루프는 객체 iteraction에 사용됩니다. 데이터 집합 또는 그 구조를 보여주십시오. –

+0

문자열 배열입니다. .get 호출 전에 로그 항목이 모든 레코드에 대해 여전히 쓰여지고 있기 때문에 루핑 중이라고 생각합니다. 나는 .get 호출이 백그라운드에서 실행되고 있으며, 노드를 종료하기 전에 실행을 끝내기를 기다리지 않는다고 생각합니다. – jjr2527

1

for 표현식을 배열과 함께 사용해서는 안됩니다. 이런 일에 대한 for 루프를 교체 :

fileLinks.forEach(function(item){ 
    check(item); 
}); 

이 많이 나가는 요청을하고, 당신은 5, the default보다 더 큰 무언가에 maxSockets을 늘릴 수 있습니다, 그렇지 않으면 예기치 않은 동작을 얻을 수 있습니다. 당신 require('http') 후이 작업을 수행 :

또한
http.globalAgent.maxSockets = 150; 

, 당신은 console.log 콜백 함수 외부, 응답이 다시 서버에서 오는 동시에 표시 할 수 없을거야 스틱 때. 어쨌든 중복됩니다. 여기서 전체 동작 예이다

var http = require('http'); 
var url = require('url'); 

function check(l) { 
    var u = url.parse(l); 

    var opts = { 
    host: u.host, 
    path: u.path, 
    agent: false // prevents pooling behavior 
    }; 

    http.get(opts, function(res) { 
     if (res.statusCode != 200) { 
      console.log(res.statusCode + ' on '+l); 
     } else { 
      console.log('success on ' + l); 
     } 
    }); 
} 

fileLinks = ['http://www.google.com','http://www.google.com']; 

fileLinks.forEach(function(item){ 
    check(item); 
}); 
+0

예가 Lukas 's처럼 작동합니다. maxSockets 설정은 도움이되지만 모든 요청이 완료되기 전에 앱이 종료됩니다. 당신의 예제에서 150 다음 다른 12 처리됩니다 또는 다음 응용 프로그램을 그냥 닫습니다. – jjr2527

+0

풀 동작을 사용하지 않으려면'agent'를'false'로 설정하십시오. – Jondlm

+0

오류, 잘못된 옵션에 대해 잘못 생각했습니다. 방금 내 대답을 편집했습니다. 시도해 봐. – Jondlm