在Node.js中的单个HTTP请求中调用多个HTTP请求

我正在尝试在一个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,并将其JSON输出附加到数组上并发送给最终用户。

谢谢

在这里,试试这个代码,

 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); }); 

说明:此代码使用asynchronous和请求节点程序包。 async.map根据定义需要3个参数,第一个是数组,第二个是你想要调用该数组的每个元素的迭代器函数,以及在async.map完成处理时调用的callback函数。

map(arr, iterator, [callback])

通过迭代器函数将arr中的每个值映射到一个新的值的数组。 迭代器用arr中的一个项目和一个callback完成处理。 这些callback中的每一个都有两个参数:一个是错误,另一个是来自arr的转换后的项目。 如果迭代器将错误传递给它的callback函数,那么主要的callback(对于map函数)会立即被调用并返回错误。

注意:所有对迭代函数的调用都是并行的。

在你的httpGet函数中,你正在调用具有传递url的request函数,并明确地告诉响应格式是jsonrequest ,当完成处理时,用三个参数调用callback函数,err – 如果有的话,res – 服务器响应,body – 响应体。 如果request没有errasync.map将这些callback的结果作为一个数组收集,并在最后将该数组传递给它的第三个callback函数。 否则,如果(err)为真,则async.map函数将停止执行并使用err调用其callbackerr

我build议使用asynchronous库。

 async.map(urls, http.get, function(err, responses){ if (err){ // handle error } else { res.send responses } }) 

上面的代码片段将并行执行每个url的http.get调用,并在收到所有响应后调用您的callback函数和所有调用的结果。

如果你想连续调用这个url,你可以使用async.mapSeries 。 如果你想限制并发请求的数量,你可以使用async.mapLimit