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

时间:2015-12-23 13:09:27

标签: javascript json node.js express npm

我试图在单个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,并将其附加到阵列上并发送给最终用户。

谢谢

2 个答案:

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

说明: 此代码使用asyncrequest节点包。根据定义,async.map需要3个参数,第一个是数组,第二个是要与该数组的每个元素一起调用的迭代器函数,以及当async.map完成处理时调用的回调函数。

  

map(arr, iterator, [callback])

     

通过映射arr中的每个值来生成新的值数组   迭代器功能。使用arr中的项调用迭代器   以及完成处理的回调。每一个   回调需要2个参数:一个错误,以及来自的转换项   ARR。如果迭代器将错误传递给其回调,则为主回调   (对于map函数)会立即调用错误。

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

在httpGet函数中,您使用传递的url调用request函数,并明确告知响应格式为jsonrequest,完成处理后,调用三个参数的回调函数,错误 - 如果有的话,服务器响应,身体 - 响应体。 如果err没有requestasync.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