2017-04-17 227 views
0

我试图从for循环中的node.js服务器(使用'request'包)发送多个HTTP请求。Node.js - 使用请求在for循环中发送多个HTTP GET

这个想法是基本上有一个URL数组,每个发送一个HTTP get,并将响应存储在一个名为'responseArray'的数组中。

当我尝试这个时,我得到'undefined',但我知道请求正在工作,如果我将它们记录到for循环内的控制台。

function apiCalls() { 
 

 
    var URLs = [‘URL1’, ‘URL2’, ‘URL3’]; 
 
    var responseArray = [] 
 
    for (var i = 0; i < URLs.length; i++) { 
 
    request({ 
 
     url: URLs[i], 
 
     method: 'GET', 
 
     headers: { 
 
     'Connection': 'close' 
 
     }, 
 
    }, function(error, response, body) { 
 
     if (error) { 
 
     console.log(error); 
 
     } else { 
 
     responseArray.push(String(response.body)); 
 
     console.log(responseArray) // this is showing me all the data in the array correctly 
 
     return responseArray; 
 
     } 
 
    }) //end request function 
 
    } //end for loop 
 
    console.log(responseArray) 
 
} //end apiCalls function 
 
apiCalls()

因此,在几个不同的解决方案,在这里寻找在堆栈溢出和elsehwere后,我尝试使用的承诺。我从来没有使用之前并根据这个离google example

承诺:

var apiCalls = new Promise(function(resolve, reject) { 
 
    var URLs = [‘URL1’, ‘URL2’, ‘URL3’]; 
 
    var responseArray = []; 
 
    for (var i = 0; i < URLs.length; i++) { 
 
    process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 
 
    request({ 
 
     url: URLs[i], 
 
     method: 'GET', 
 
     headers: { 
 
     'Connection': 'close' 
 
     }, 
 
    }, function(error, response, body) { 
 
     if (error) { 
 
     console.log(error); 
 
     } else { 
 
     resolve(responseArray.push(String(response.body)) 
 
     } 
 
    }) //end request 
 

 
    } //end for loop 
 
}) 
 

 
apiCalls.then(function(result) { 
 
    console.log('this is calling the promise') 
 
    console.log(result) 
 
}, function(err) { 
 
    console.log(err) 
 
});

我总是得到一个空数组当我尝试后的for循环日志responseArray。或者 - 我得到“未定义”如果我试图返回的数组赋值给一个变量,像这样:

var gimmeAllResponses = apiCalls(); 
 
console.log(gimmeAllResponses); //returns 'undefined'

谁能告诉我我要去哪里错了吗?如何在for循环完成后更新'responseArray'数据?

+1

你从哪里得到'undefined'?在控制台上?是不是'console.log(error)'语句,你认为? – amn

回答

1

这是有点关闭,因为这需要替代包,request-promise

你正在解决很多次。由于您使用的是Node.js,因此很可能ES6功能可用。使用Array.prototype.map()Promise.all()

var rp = require('request-promise'); 
var URLs = [‘URL1’, ‘URL2’, ‘URL3’]; 
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 
var responseArray = Promise.all(URLs.map((url) => rp({ 
    uri: url, 
    method: 'GET', 
    headers: { 
    'Connection': 'close' 
    } 
}).then((error, response, body) => { 
    if (error) { 
     console.log(error); 
    } else { 
     return String(response.body); 
    } 
    })));