Aufruf mehrere HTTP-requests in einer einzigen HTTP-Anforderung in Node.js
Ich versuche zu rufen mehrere URL in einer einzelnen URL-Aufruf und schieben Sie die json-Antwort in ein array und senden Sie das array in Reaktion auf den Anwender.
Mein code wie folgt Aussehen:
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);
});
Habe ich auch versucht, diese mit npm Anfrage-Modul.
Wenn ich diesen code ausführen es nur NULL zurückgeben, oder einige zufällige Ausgabe, die nur den Header.
Mein Ziel ist zu nennen, mehrere URL ' s in einem einzelnen Knoten get-Anforderung aus, und fügen Sie die JSON-Ausgabe auf ein array und senden Sie an die Endbenutzer.
Dank
Yo haben, um Rückrufe oder kann ich vorschlagen, das Async-Modul github.com/caolan/async
Siehe Antwort. Sie sollte eigentlich warten Sie auf das Ende der Reaktion durch die Verwendung
Siehe Antwort. Sie sollte eigentlich warten Sie auf das Ende der Reaktion durch die Verwendung
res.on('end', function...
InformationsquelleAutor Vaibhav Jain | 2015-12-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier versuchen, diesen code,
Erklärung :
Dieser code verwendet async und Anfrage Knoten Pakete.
async.map
per definition nimmt 3 Parameter, der erste ist ein array, der zweite die iterator-Funktion, die Sie aufrufen möchten, mit jedem element des Arrays, und die callback-Funktion, die aufgerufen wird, wenn async.Karte fertig verarbeitet.Hinweis: Alle Anrufe iterator-Funktion parallel sind.
In Ihrem httpGet Funktion, die Sie anrufen
request
- Funktion mit übergebenen url, und ausdrücklich sagen, die Antwort-format werdenjson
.request
, wenn Verarbeitung beendet ist, ruft die callback-Funktion mit drei Parameter, - äh- wenn überhaupt-res - server-Reaktion, Körper - Antwort der Körper.In Fall gibt es keine
err
ausrequest
,async.map
sammelt die Ergebnisse aus diesen Rückrufe in einem array und übergibt dieses array an das Ende seiner Dritten, callback-Funktion. Sonst,wenn (err) wahr ist, dieasync.map
- Funktion Stoppt die Ausführung, und ruft die Rückruffunktion mit einemerr
.request
hier? wie wäreasync
? die Verwendung von Bibliotheken zu Antworten, ist gut, aber nur, wenn Sie angeben, welche Bibliotheken Sie verwenden 😛Gut, der Fragesteller scheint schon bewusst ist, diese Pakete. Jedenfalls, Aktualisierung für andere Benutzer.
Vielen Dank ,Es funktioniert. Auf der Suche nach einigen generator Zeug.
Dies ist eine große Antwort. Sehr gut erklärt.
vielen Dank für diese. Ist es möglich Zusammenführen, alle Daten der Einrichtungen in ein ? Dies ist, wie es für mich ausschaut, wenn ich downlad JSON-form mehrere URls i.imgur.com/nX1IRla.png. Würden Sie wissen, wie zu mischen Sie Sie unter 1 Daten-Körper ?
InformationsquelleAutor yoogeeks
Empfehle ich den async Bibliothek.
Dem snippet oben führt eine
http.get
nennen Sie für jede der urls parallel, und rufen Sie Ihre callback-Funktion, mit der die Ergebnisse aller der Anrufe, nach der alle Antworten empfangen wurden.Wenn Sie möchten, rufen Sie die urls in der Serie, die Sie verwenden können
async.mapSeries
statt. Wenn Sie möchten, um die Anzahl der gleichzeitigen Anfragen, die Sie verwenden könnenasync.mapLimit
.Hinweis:
async.each
Rückruf nicht behandeln Antworten. Wenn Sie die Antworten am Ende des Anrufs, die Sie verwenden solltenasync.map
die Antwort von jedem HTTP-request in form eines Arrays in der callback-Funktion.Sind Sie richtig. Ich aktualisiert meine Antwort.
InformationsquelleAutor Ita