我试图在单个URL调用中调用多个URL并在数组中推送它的json响应并发送该数组以响应最终用户。
我的代码如下所示:
var express = require('express');
var main_router = express.Router();
var http = require('http');
urls = [
"http://localhost:3010/alm/build_tool",
"http://localhost:3010/alm/development_tool",
"http://localhost:3010/alm/project_architecture"];
var responses = [];
main_router.route('/')
.get(function (req, res) {
var completed_requests = 0;
for (url in urls) {
http.get(url, function(res) {
responses.push(res.body);
completed_request++;
if (completed_request == urls.length) {
// All download done, process responses array
}
});
}
res.send(responses);
});
我也尝试使用npm请求模块。 当我运行此代码时,它只返回NULL或一些只有标题的随机输出。
我的目标是在单个节点获取请求中调用多个URL,并将其附加到阵列上并发送给最终用户。
谢谢
答案 0 :(得分:21)
在这里,试试这段代码,
const async = require('async');
const request = require('request');
function httpGet(url, callback) {
const options = {
url : url,
json : true
};
request(options,
function(err, res, body) {
callback(err, body);
}
);
}
const urls= [
"http://localhost:3010/alm/build_tool",
"http://localhost:3010/alm/development_tool",
"http://localhost:3010/alm/project_architecture"
];
async.map(urls, httpGet, function (err, res){
if (err) return console.log(err);
console.log(res);
});
说明:
此代码使用async和request节点包。根据定义,async.map
需要3个参数,第一个是数组,第二个是要与该数组的每个元素一起调用的迭代器函数,以及当async.map完成处理时调用的回调函数。
map(arr, iterator, [callback])
通过映射arr中的每个值来生成新的值数组 迭代器功能。使用arr中的项调用迭代器 以及完成处理的回调。每一个 回调需要2个参数:一个错误,以及来自的转换项 ARR。如果迭代器将错误传递给其回调,则为主回调 (对于map函数)会立即调用错误。
注意:对迭代器函数的所有调用都是并行的。
在httpGet函数中,您使用传递的url调用request
函数,并明确告知响应格式为json
。 request
,完成处理后,调用三个参数的回调函数,错误 - 如果有的话,服务器响应,身体 - 响应体。
如果err
没有request
,async.map
会将这些回调的结果作为数组收集,并将该数组的末尾传递给第三个回调函数。否则,如果(err)为真,async.map
函数将停止执行并使用err
调用其回调。
答案 1 :(得分:4)
我建议使用async库。
async.map(urls, http.get, function(err, responses){
if (err){
// handle error
}
else {
res.send responses
}
})
上面的代码段将对每个网址并行执行http.get
调用,并会在收到所有回复后调用您的回调函数以及所有调用的结果。
如果您想要系列调用网址,可以使用async.mapSeries
代替。如果要限制并发请求的数量,可以使用async.mapLimit
。