5 Möglichkeiten für HTTP-Anfragen in Node.js mithilfe von Async/Await

March 19, 2020
Autor:in:
Sam Agnew
Twilion

5 Möglichkeiten für HTTP-Anfragen in Node.js mithilfe von Async/Await

Hallo und Danke fürs Lesen! Dieser Blogpost ist eine Übersetzung von 5 Ways to Make HTTP Requests in Node.js using Async/Await. Während wir unsere Übersetzungsprozesse verbessern, würden wir uns über Dein Feedback an help@twilio.com freuen, solltest Du etwas bemerken, was falsch übersetzt wurde. Wir bedanken uns für hilfreiche Beiträge mit Twilio Swag :)

HTTP-Anfragen sind eine Kernfunktion moderner Programmiersprachen und eines der ersten Dinge, die Entwickler lernen, wenn sie sich mit neuen Umgebungen vertraut machen. Für Node.js gibt es sowohl dank Integrationen in der Sprache als auch durch Beiträge der Community eine angemessene Menge an Lösungen für dieses Problem. Schauen wir uns die gängigsten an.

Vor ein paar Jahren habe ich einen ähnlichen Post zu diesem Thema geschrieben. Da sich die Funktionalität von Async/Await im JavaScript-Code zunehmend etabliert und immer häufiger verwendet wird, sind Netzwerkanfragen so unkompliziert wie nie zuvor. Noch dazu ist Request als zuvor am häufigsten verwendete HTTP-Bibliothek für Node veraltet. Es wird also Zeit für einen aktualisierten Leitfaden!

Wie im anderen Post auch, nutzen wir die API NASA’s Astronomy Picture of the Day als JSON-API, mit der wir in all diesen Beispielen interagieren, denn es bleibt wie es ist: das All ist einfach die coolste Sache überhaupt.

Pizza GIF

Bevor es losgeht, überprüfe, ob auf deinem Rechner die aktuellen Versionen von Node.js und npm installiert sind.

HTTP – die Standardbibliothek

Um Vergleiche ziehen zu können, widmen wir uns zunächst dem HTTP-Modul ohne Promises und Async/Await. Der Vorteil dieses Moduls ist zwar, dass wir uns nicht auf irgendwelche Abhängigkeiten verlassen müssen. Verglichen mit anderen Lösungen hapert es aber an der Entwicklerfreundlichkeit.

Der folgende Code sendet eine GET-Anfrage an die NASA-API und druckt die URL für das Astronomiebild des Tages sowie eine Erklärung aus:

const https = require('https');

https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', (resp) => {
  let data = '';

  // A chunk of data has been received.
  resp.on('data', (chunk) => {
    data += chunk;
  });

  // The whole response has been received. Print out the result.
  resp.on('end', () => {
    console.log(JSON.parse(data).explanation);
  });

}).on("error", (err) => {
  console.log("Error: " + err.message);
});

Viele Modulfunktionalitäten von http und https haben ein recht niedriges Niveau. Wir erhalten die Antwortdaten nur bröckchenweise und müssen unbedingt auf den Zeitpunkt achten, an dem wir alle Daten erhalten haben. Außerdem müssen wir die Antwortdaten manuell parsen. Außerdem unterstützt dieses Modul HTTPS nicht standardmäßig, daher benötigen wir stattdessen das https-Modul, wenn die von uns verwendete API über HTTPS kommuniziert. Auch wenn wir die Async/Await-Funktion für die mit dieser Bibliothek gestellten HTTP-Anfragen nicht nutzen können, kannst du asynchrone Streams zur Stückelung der Daten potenziell verwenden.

Der Weg zu den von uns gewünschten Daten ist zwar etwas steinig, aber wenn wir auf das Hinzufügen von Abhängigkeiten zu unserem Code verzichten und auf die Low-Level-Funktionalität zugreifen möchten, ist dieses Dienstprogramm ganz hilfreich.

Got

Got ist eine ausgezeichnete Wahl, wenn du lieber leichtgängigere Bibliotheken nutzen möchtest. Es überzeugt durch Benutzerfreundlichkeit und kann standardmäßig in Twilio Functions verwendet werden.

Installiere Got mit npm:

npm install got@9.6.0

Da Got Promises nutzt, können wir erkennen, dass im Vergleich zu oben viel weniger Code zum Erledigen derselben Task notwendig ist. Außerdem können Async- und Await-Schlüsselwörter genutzt werden:

const got = require('got');

(async () => {
  try {
    const response = await got('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', { json: true });
    console.log(response.body.url);
    console.log(response.body.explanation);
  } catch (error) {
    console.log(error.response.body);
  }
})();

Diese Bibliothek parst JSON nicht standardmäßig, daher müssen wir beim Stellen der Anfrage { json: true } als Argument hinzufügen. Got ist als benutzerfreundliche Bibliothek eine fantastische Wahl und geht mit HTTP-Anfragen auf vernünftige Weise um.

Axios

Axios ist ein weiterer Promise-basierter HTTP-Client, der für Browser und node.js funktioniert.

Gib zur Installation von Axios aus npm den folgenden Befehl in deinem Terminal ein:

npm install axios@0.19.2

Der folgende Code protokolliert die URL und erklärt das Astronomiebild des Tages ebenso:

const axios = require('axios');

(async () => {
  try {
    const response = await axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY')
    console.log(response.data.url);
    console.log(response.data.explanation);
  } catch (error) {
    console.log(error.response.body);
  }
})();

Axios parst JSON-Antworten sogar standardmäßig. Wie praktisch! Mit axios.all kannst du sogar mehrere gleichzeitige Anfragen stellen, wenn du beispielsweise an den Astronomiebildern von zwei verschiedenen Tagen interessiert bist:

const axios = require('axios');

(async () => {
  try {
    const [response1, response2] = await axios.all([
      axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2020-03-18'),
      axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2020-03-17')
    ]);
    console.log(response1.data.url);
    console.log(response1.data.explanation);

    console.log(response2.data.url);
    console.log(response2.data.explanation);
  } catch (error) {
    console.log(error.response.body);
  }
})();

SuperAgent

Ähnlich wie Axios ist SuperAgent eine weitere verbreitete Bibliothek, die in erster Linie zum Stellen von asynchronen Anfragen im Browser genutzt wird, aber auch mit Node.js funktioniert. Nutze diesen Befehl für die Installation von SuperAgent:

npm install superagent@5.2.2

Das Coole an SuperAgent ist, dass du von weiteren nützlichen Funktionen profitierst, die du in die Anfragen integrieren kannst, zum Beispiel query(), um den Anfragen Parameter hinzuzufügen. Auf das Durchlaufen als options-Objekt kannst du demnach verzichten. In den vorherigen Beispielen haben wir diese manuell der URL hinzugefügt, aber hier siehst du die Funktion von SuperAgent dafür:

const superagent = require('superagent');

(async () => {
  try {
    const queryArguments = {
      api_key: 'DEMO_KEY',
      date: '2020-03-18'
    }

    const response = await superagent.get('https://api.nasa.gov/planetary/apod').query(queryArguments)
    console.log(response.body.url);
    console.log(response.body.explanation);
  } catch (error) {
    console.log(error.response.body);
  }
})();

Wie auch bei Axios musst du die JSON-Antwort nicht selbst parsen, was sehr praktisch ist.

node-fetch

node-fetch ist ein einfaches Modul, mit dem die Browserbibliothek window.fetch mit nur minimalem Code zu Node.js gelangt.

Installiere node-fetch wie in den vorherigen Beispielen auch folgendermaßen:

npm install node-fetch@2.6.0

Aktuelle Versionen dieser Bibliothek nutzen Promises, sodass wir auch die Syntax von Async/Await nutzen können:

const fetch = require('node-fetch');

(async () => {
  try {

    const response = await fetch('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY')
    const json = await response.json()

    console.log(json.url);
    console.log(json.explanation);
  } catch (error) {
    console.log(error.response.body);
  }
})();

Diese Bibliothek bietet eine integrierte Funktion zur Konvertierung der Antwort in JSON, das passiert jedoch nicht automatisch, wie wir das von Axios und SuperAgent kennen. Für alle, die mit der Verwendung der Fetch-API im Browser vertraut sind, ist das eine großartige Bibliothek.

Abschließende Gedanken

Natürlich fanden hier nicht alle Lösungen Platz, aber du weißt nun, wie die grundlegenden Funktionen in ein paar wenigen, verbreiteten HTTP-Bibliotheken in Node aussehen.

Andere Programmiersprachen bieten eine ähnliche Vielfalt an Bibliotheken, um dieses Problem zu lösen. Sieh dir weitere Tutorials zu SwiftPython und Ruby an. Außerdem empfehle ich dir Node.js-Schnellstart als Ort, an dem du dich mit deinen neuen Fähigkeiten austoben kannst.

Wie sendest du HTTP-Anfragen am liebsten? Du kannst mich gerne kontaktieren, um deine Erfahrungen zu teilen oder Fragen zu stellen.