Вызов нескольких 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
.