2014-01-23 3 views
3

У меня на самом деле проблема с кодом javascript, выполняемым с node.js Мне нужно отправить http-запросы в цикле на удаленный сервер (я установил www.google.ca в коде). Вот мой код:Node.js отправляет http-запрос в цикле

var http = require('http'); 

var options = { 
    hostname: 'www.google.ca', 
    port: 80, 
    path: '/', 
    method: 'GET' 
}; 

function sendRequest(options){ 
    console.log('hello'); 
    var start = new Date(); 
    var req = http.request(options,function(res) { 
     console.log('Request took:', new Date() - start, 'ms'); 
    }); 
    req.on('error', function(e) { 
     console.log('problem with request: ' + e.message); 
    }); 
    req.end(); 
}; 

for(var i=0;i<10;i++){ 
    sendRequest(options); 
} 

У меня есть проблема в том, что, независимо от того, сколько раз я иду через мой цикл, я получаю ответ на только 5 первых из них. Для остальных запросов вызывается функция sendRequest(), но я не получаю никаких ответов, ни сообщения об ошибке. И тогда программа завершается. Однако он отлично работает, когда я устанавливаю localhost как хост. У кого-нибудь есть решение этой проблемы? Спасибо заранее!

+0

возможного дубликатом [Node.js http.get зависает после 5 запросов к удаленному сайту] (http://stackoverflow.com/questions/16965582/node-js- http-get-hangs-after-5-request-to-remote-site) – loganfsmyth

+0

Удаленный сервер ограничивает количество параллельных запросов. Попробуйте отправить эти запросы последовательно. – umair

ответ

3

Возможно, ваша машина или удаленная машина будут перегружены 10 одновременными запросами. попробуйте отправить их по одному, вам придется подождать, пока первый запрос не завершится до продолжения. один простой способ сделать это с async.timesSeries

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

var options = { 
    hostname: 'www.google.ca', 
    port: 80, 
    path: '/', 
    method: 'GET' 
}; 

function sendRequestWrapper(n, done){ 
    console.log('Calling sendRequest', n); 
    sendRequest(options, function(err){ 
    done(err); 
    }); 
}; 

function sendRequest(options, callback){ 
    //console.log('hello'); 
    var start = new Date(); 
    var req = http.request(options,function(res) { 
    // I don't know if this callback is called for error responses 
    // I have only used the `request` library which slightly simplifies this 
    // Under some circumstances you can accidentally cause problems by calling 
    // your callback function more than once (e.g. both here and on('error') 

    console.log('Request took:', new Date() - start, 'ms'); 
    callback(null); 
    }); 
    req.on('error', function(e) { 
    console.log('problem with request: ' + e.message); 
    callback(err); 
    }); 
    req.end(); 
}; 

async.timesSeries(10, sendRequestWrapper); 
Смежные вопросы