2016-04-29 4 views
0

Поиск почти невозможно захватить ответ HTTP-запросов в цикле как массив. Я могу видеть массив в console.log, но когда я передаю массив как ответ http-сервера, я получаю пустой массив. Что я делаю неправильно, или есть ли лучшие способы сделать это?Выполнение http-запросов в looppoints

Код:

router.route('/uprns').post(function(request, response){ 
    response.setHeader('content-type', 'application/text'); 

    console.log('first element from the array is '+request.body.UPRNS[0]); 
    console.log('Number of items in array is '+request.body.UPRNS.length); 

if (request.body.UPRNS.length == 0) { 
     response.send('no UPRNS in request'); 
    } 

    var output = []; 
    var obj = ''; 

    for(var i = 0; i < request.body.UPRNS.length; i++) { 

    obj = request.body.UPRNS[i]; 

    //Make HTTP calls to  
    var options = { 
     host: 'orbisdigital.azure-api.net', 
     path: '/nosecurity/addresses?uprn='+obj // full URL as path 
    }; 

    callback = function(res) {  
     res.on('data', function (chunk) { 
     output.push(chunk.toString()); 
     }); 

     //the whole response has been recieved 
     res.on('end', function() { 
     console.log(output); 
     }); 
    } 

    Https.request(options, callback).end(); 
    } 

    response.send(output); 

}); 

Я знаю, что есть много разговоров о блокировании процесса в цикле, но нет окончательного рекомендуемый способ иметь дело с HTTP вызовов в цикле. Спасибо.

+0

Важный элемент элементов в выходной массиве? Должен ли он соблюдать порядок http-запросов? –

+0

Порядок не важен в моем случае, но хотел бы знать, как добиться порядка. – noexpert

ответ

0

Вот код. См. Код для комментариев. Прочитайте некоторое асинхронное программирование с помощью node.js, here's a starter.

router.route('/uprns').post(function (request, response) { 
    response.setHeader('content-type', 'application/text'); 
    console.log('first element from the array is ' + request.body.UPRNS[ 0 ]); // your 1st element in JSON array. 

    console.log('Number of items in array is ' + request.body.UPRNS.length); 
    var output = []; 
    var obj = ''; 

    for (var i = 0; i < request.body.UPRNS.length; i++) { 

     obj = request.body.UPRNS[ i ]; 

     console.log(obj); 

     //Make HTTP calls to 

     var options = { 
      host: 'orbisdigital.azure-api.net', 
      path: '/nosecurity/addresses?uprn=' + obj // full URL as path 
     }; 

     Https.request(options, callback).end(); 

    } 

    var countResponses = 0; 
    // Don't make functions in a loop, so I moved this function down 
    // here. 
    function callback(res) { 

     res.on('data', function (chunk) { 
      output.push(chunk.toString()); 
     }); 

     // Handles an error 
     request.on('error', function(err) { 
      console.error(err.stack); 
      response.statusCode = 500; // or what ever. 
      response.send(500, 'there was an error'); 
     }); 

     //the whole response has been recieved 
     res.on('end', function() { 
      console.log(output); 
      countResponses++; 
      if (countResponses === request.body.UPRNS.length) { 

       // Previously this code was executed directly 
       // after the loop finished. It did not wait for 
       // all the responses, so it sent the empty response. 
       // However, the other console.log(output) statements 
       // were called after this. 
       // 
       // There is a bug here that if request.body.UPRNS.length 
       // is zero, then the user will never get a response. I 
       // let you fix this up :). 
       response.send(output); 
      } 
     }); 

    } 

}); 
+0

Что делать, если во время запроса есть ошибка? –

+0

@stdob: Да, хороший момент, я добавлю. Также когда request.body.UPRNS.length равен нулю, напишите мне вопрос. – psiphi75

+0

Отлично, работал как шарм. будет работать над обработкой нулевых запросов. Спасибо за вашу помощь. – noexpert