2017-09-01 1 views
0

Demande: https://www.npmjs.com/package/requestNode.js async.queue se bloque lors de la création de requêtes http avec le module de requête npm. Affiche une

Je ne parviens pas à en demandant une énorme quantité de sites (10000 à la fois) avec le module de demande dans une file d'attente. Cela fonctionne par exemple pour 250 ou plus. Cependant, lorsque je fournis un csv de quelque chose près de 300 ou plus, le script se bloque et le q.drain ne se déclenche jamais vraiment. code:

program.command('sanitizedata <file> <outfile>').description('Sanitize Data').action((file, outfile) => { 
if(file !== '' && outfile != '') { 

var request = require("request"); 
var parse = require('url-parse'); 

csv({noheader:false, trim:true}) 
.fromFile(file) 
.on('end_parsed', function(SitesArray) { 
    var possibleUrls = []; 
    var q = async.queue(function (task, done) { 
    var parsed = parse(task.url); 

    if(parsed.protocol == '') { 
     task.url = 'http://' + task.url; 
     task.host = parsed.pathname; 
    } 

    var options = { 
     url: `${task.url}`, 
     headers: { 
     'User-Agent': 'request', 
     'Host': `${task.host}` 
     } 
    }; 

    request(options , function(err, res, body) { 
     if (err) return done(err); 
     if (res.statusCode != 200) return done(res.statusCode); 

     done(res); 
    }); 
    }, 5); 

    SitesArray.map(function(site, index) { 
    q.push(site, function(result) { 
     if(result.statusCode == 200) { 
     delete site['host']; 
     console.log('\x1b[42m\x1b[37m%s\x1b[0m \x1b[46m\x1b[37m%s\x1b[0m', `Assert Success:${site.url}`, `${index}`); 
     possibleUrls.insert(site.index, site); 
     } else { 
     console.log('\n\r' + result) 
     return false; 
     } 
    }); 
    }); 

    q.drain = function() { 
    var csvOutput = toCSV(possibleUrls); 
    console.log('draining') 
    fs.outputFile(`./data/sanitizedata/${outfile}`, csvOutput, function(err) { 
     if(err) { 
      return console.log(err); 
     } 
     console.log(`The file ${outfile} was saved!`); 
     process.exit(); 
    }); 
    console.log('all items have been processed'); 
    } 
}); 
}} 
); 

Quelque part près de la dernière demande, il affiche une erreur ETIMEDOUT (connection timed out). J'ai données au format csv ..

index,url 
... 
... 
9993,supercircusspectacular.com 
9994,theleadershipnetwork.com 
9995,wizardofozthemusical.com 
9996,allnews365.com 
9997,blog.vendhq.com 
9998,businesspropertynetwork.co.uk 
9999,dashboardjunkie.com 

Répondre

0

j'ai pu utiliser un return devant done(res); afin de traiter le cas d'erreur.

request(options , function(err, res, body) { 
    if (err) return done(err); 
    if (res.statusCode != 200) return done(res.statusCode); 

    return done(res); 
});