2017-09-01 127 views
0

請求:https://www.npmjs.com/package/request使用請求npm模塊發出http請求時,Node.js async.queue掛起。顯示了

我有同時要求網站在隊列中的請求模塊數額巨大(10000一次)的麻煩。它適用於說250或更多列表。但是,當我提供csv的任何接近300或更多的東西時,它只是掛起而q.drain從未真正觸發。 代碼:

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'); 
    } 
}); 
}} 
); 

某處的最後一個請求接近它顯示了一個ETIMEDOUT (connection timed out)錯誤。我有數據以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 

回答

0

我能夠在done(res);前以處理錯誤的情況下使用return

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

    return done(res); 
});