Node.js - 使用请求在for循环中发送多个HTTP GET
问题描述:
我试图从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'数据?
答
这是有点关闭,因为这需要替代包,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);
}
})));
你从哪里得到'undefined'?在控制台上?是不是'console.log(error)'语句,你认为? – amn