2013-07-03 4 views
0

Je tente d'avoir une boucle avec les requêtes http.get - et je ne sais pas pourquoi la fonction ne démarre pas. mon code est:nœud http.get non déclenché

while(List.length>0) {     
    if(counter < Limit) { // Limit is the amount of requests I want to 
     counter++; 
     inProcess++; 
     var scanitem = List.pop(); 

     var body = "";  
     var url = 'https://www.mywebsite.com/'+scanitem; 
     var options = { 
         path: url,             
         method: 'GET' 
        }; 
     console.log(url); // This part is happenning 
     var _request = https.get(options, function (res) { 
         console.log('get web site');// this part is NOT showup. 
         res.on('data', function (chunk) { 
          console.log(chunk); // this part is NOT showup. 
          body += chunk.toString();    
         }); 
         res.on("end", function() {        
         console.log(body);// this part is NOT showup. 
         }); 
         res.on("error", function(error) {       
         console.log('error')// this part is NOT showup. 
         }); 
        }); 
     _request.end();   
    }           
    else { 
     console.log('list BREAK');} // This part is happenning after the limit crossed 
+0

Vous pouvez d'abord ajouter '_request.on (" erreur ", fonction (erreur)' pour trouver des erreurs.Si la requête elle-même peut échouer avant l'envoi d'une réponse, aucune erreur de réponse ne s'affichera – user568109

+0

Si vous ne donnez aucun serveur, vous pouvez rejeter la demande elle-même, – user568109

Répondre

0
  1. Lors du passage d'un Object comme 1er argument, l'URL doit être brisée en morceaux individuels:

    var options = { 
        method: 'GET', 
        protocol: 'https:', 
        hostname: 'www.mywebsite.com', 
        path: '/' + scanitem 
    }; 
    
    var _request = https.get(options, ...); 
    

    Les options qui sont utilisés sont couverts par https.request() , qui https.get() est une variante de commodité de.

    Vous pouvez également transmettre l'URL String qui https.get() sera lancé par url.parse() pour vous:

    var _request = https.get(url, ...); 
    
  2. JavaScript ne pas variables de bloc-scope (yet). Donc, malgré l'emplacement de var body = "";, chaque itération de votre boucle while est toujours ajoutée à la même body.

    Ce n'est pas un problème si la variable est uniquement utilisée par des tâches synchrones, comme scanitem, url et options. Mais, lors du mixage de tâches asynchrones telles que https.get(), vous n'obtiendrez probablement pas le résultat attendu.

    En l'absence actuelle de variables de portée de bloc, vous pouvez utiliser un closure pour créer une portée function supplémentaire.

    Comme List semble être un Array, vous pouvez utiliser un itérateur function avec .forEach() pour cela:

    List.forEach(function (scanitem) { 
        var body = ''; 
        var url = 'https://www.mywebsite.com/'+scanitem; 
    
        https.get(url, function (res) { 
         // etc. 
        }); 
    }); 
    

    Et, pour la Limit, vous pouvez utiliser .splice() pour enlever et travailler avec la partie de la Array vous voulez:

    List.splice(0, Limit).forEach(function (scanitem) { 
        // etc. 
    }); 
    

En outre, contrairement à https.request(), vous n'êtes pas obligé d'appeler _request.end() lorsque vous utilisez https.get().

+0

ne fonctionne toujours pas, quand je la retire de la boucle, ça marche très bien, mais quand ça fait partie d'un processus - c'est en quelque sorte ça! t lancer la demande. – ItayM

Questions connexes