Вызов нескольких 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-адресов в одном узле get request и добавить его вывод JSON в массив и отправить конечному пользователю.

спасибо

2 ответов


вот, попробуйте этот код

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.map по определению принимает 3 параметра, первый из которых является массивом, второй-функция итератора, которую вы хотите вызвать с каждым элементом этого массива, и функция обратного вызова, вызываемая при асинхронности.карта закончила обработку.

map(arr, iterator, [callback])

создает новый массив значений сопоставляя каждое значение в arr через функция итератора. Итератор вызывается с элементом из arr и обратный вызов, когда он закончил обработку. Каждый из них обратный вызов принимает 2 аргумента: ошибку и преобразованный элемент из прибытие. Если итератор передает ошибку своему обратному вызову, основной обратный вызов (для функции map) немедленно вызывается с ошибкой.

Примечание: все вызовы функции итератора параллельны.

внутри вашего httpGet функция, вы вызываете request функция с переданным url-адресом и явно сообщает формат ответа json. request, по завершении обработки, вызывает функцию обратного вызова с тремя парами, err-если таковые имеются, Res-server response, body-response body. В случае, если нет err С request, async.map собирает результаты этих обратных вызовов в виде массива и передает этот массив в конце его третьей функции обратного вызова. В противном случае, если (err) истинно,


Я предлагаю использовать асинхронные библиотека.

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

фрагмент выше будет выполнять http.get вызовите каждый из URL-адресов параллельно и вызовите функцию обратного вызова с результатами всех вызовов после получения всех ответов.

если вы хотите вызвать URL-адреса последовательно, вы можете использовать async.mapSeries вместо. Если вы хотите ограничить количество одновременных запросов, вы можете использовать async.mapLimit.