Daten von APIs in Node.js abrufen
Wenn Sie als Frontend-Entwickler Node.js-Code schreiben, haben Sie wahrscheinlich aus Gewohnheit zu Axios gegriffen oder sich gefragt, ob Sie noch node-fetch benötigen. Die Antwort ist heute einfacher, als Sie vielleicht denken: Modernes Node.js verfügt über eine stabile, integrierte fetch-API, und für die meisten Anwendungsfälle ist das alles, was Sie brauchen.
Hier erfahren Sie, was Sie wissen müssen, um heute saubere, zuverlässige serverseitige HTTP-Anfragen zu erstellen.
Wichtigste Erkenntnisse
- Modernes Node.js wird mit einer globalen
fetch-API ausgeliefert, die von undici betrieben wird – keine Pakete müssen installiert werden. fetchwirft bei HTTP-Fehlern wie 404 oder 500 keine Exceptions. Prüfen Sie immerresponse.ok, bevor Sie den Body lesen.- Verwenden Sie
AbortSignal.timeout()für Request-Timeouts anstelle manuellerAbortController-Verkabelung. - Nutzen Sie für Hochdurchsatz-Szenarien mit wiederholten Anfragen an denselben Origin undici’s
Poolfür Connection-Reuse. - Bevorzugen Sie natives
fetchgegenüber Axios in reinen Node-Projekten, um Ihre Abhängigkeitsliste schlank zu halten.
Die Node.js Fetch API ist stabil und integriert
Seit Node.js 18 ist fetch global verfügbar, ohne dass Imports erforderlich sind. Es wurde in v18 als experimentell markiert und dann in v21 stabilisiert. Es wird unter der Haube von undici betrieben – dem HTTP-Client, der Node’s fetch-Implementierung zugrunde liegt – und spiegelt die Browser-Fetch-API wider, die Sie bereits kennen.
Keine Installation. Kein require('node-fetch'). Einfach fetch().
const response = await fetch("https://api.github.com/users/nodejs/repos", {
headers: { "User-Agent": "my-app" },
})
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`)
}
const repos = await response.json()
console.log(repos.map((r) => r.name))
Ein wichtiger Punkt: fetch wirft keine Exceptions bei HTTP-Fehlern wie 404 oder 500. Es wirft nur bei Netzwerkausfällen. Prüfen Sie immer response.ok oder response.status, bevor Sie den Body lesen.
POST-Anfragen mit der Node.js Fetch API erstellen
Das Senden von Daten ist unkompliziert. Setzen Sie method, fügen Sie einen Content-Type-Header hinzu und serialisieren Sie Ihre Payload:
const response = await fetch("https://api.example.com/posts", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ title: "Hello", body: "World" }),
})
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`)
}
const data = await response.json()
Für FormData-Uploads lassen Sie den Content-Type-Header ganz weg – fetch setzt ihn automatisch mit der korrekten Multipart-Boundary.
Timeouts mit AbortSignal handhaben
Es gibt keine integrierte Timeout-Option für den fetch-Aufruf selbst, aber AbortSignal.timeout() macht es elegant:
const response = await fetch("https://api.example.com/data", {
signal: AbortSignal.timeout(5000), // 5 Sekunden
})
Wenn die Anfrage das Limit überschreitet, wird sie abgebrochen. Kein manuelles AbortController-Setup für den einfachen Fall erforderlich.
Für komplexere Szenarien – beispielsweise wenn Sie eine Anfrage basierend auf einer Benutzeraktion abbrechen und ein Timeout erzwingen möchten – können Sie einen AbortController mit AbortSignal.any() kombinieren:
const controller = new AbortController()
const response = await fetch("https://api.example.com/data", {
signal: AbortSignal.any([
controller.signal,
AbortSignal.timeout(5000),
]),
})
// Rufen Sie controller.abort() an anderer Stelle auf, um manuell abzubrechen
Discover how at OpenReplay.com.
Wann sollte man undici direkt verwenden
Für die meisten Node.js-API-Anfragen ist globales fetch das richtige Werkzeug. Aber wenn Sie viele Anfragen an denselben Origin stellen – etwa wiederholt einen internen Service aufrufen – bietet Ihnen undici’s Pool Connection-Reuse und feinere Kontrolle.
import { Pool } from "undici"
const pool = new Pool("https://internal-api.example.com", {
connections: 10,
})
const { statusCode, body } = await pool.request({
path: "/data",
method: "GET",
})
const data = await body.json()
Beachten Sie, dass pool.request() einen body zurückgibt, der ein Readable Stream ist, kein Response-Objekt. Sie müssen ihn explizit konsumieren – zum Beispiel mit body.json() oder body.text().
Verwenden Sie undici direkt, wenn Sie erweitertes Pooling, effizientes Streaming großer Responses oder maximalen Durchsatz in performance-kritischem Code benötigen.
Node.js Fetch vs. Axios: Was sollten Sie verwenden?
| Native Fetch | Axios | |
|---|---|---|
| Installation erforderlich | Nein | Ja |
| Browser-kompatibel | Ja | Ja |
| Auto-JSON-Parsing | Nein (.json() aufrufen) | Ja |
| Interceptors | Manuell | Integriert |
| Wirft bei HTTP-Fehlern | Nein | Ja |
| Timeout-Option | AbortSignal | Integriert |
Axios bleibt eine solide Wahl, wenn Sie Interceptors, automatisches JSON-Parsing oder konsistentes Verhalten über Browser und Node in derselben Codebasis hinweg möchten. Aber wenn Sie reinen Node-Code schreiben und diese Extras nicht benötigen, hält natives fetch Ihre Abhängigkeitsliste sauber.
Vermeiden Sie node-fetch für neue Projekte. Es war die richtige Lösung vor Node 18, ist aber jetzt auf jeder unterstützten Node.js-Version redundant.
Fazit
Für serverseitige HTTP-Anfragen in modernem Node.js beginnen Sie mit dem integrierten fetch. Es ist stabil, vertraut und erfordert nichts Extra. Fügen Sie AbortSignal.timeout() für Timeouts hinzu, prüfen Sie response.ok auf Fehler und greifen Sie nur dann zu undici’s Pool, wenn die Performance es erfordert. Behalten Sie Axios in Ihrem Toolkit, wenn Sie seine höherwertigen Features wirklich benötigen – aber installieren Sie es nicht standardmäßig.
Häufig gestellte Fragen (FAQs)
Ja. Die globale fetch-API wurde in Node.js 18 als experimentell eingeführt und wurde in Node.js 21 stabil. Sie wird von undici betrieben und erfordert keine zusätzlichen Pakete. Jede aktuell unterstützte Node.js-Version enthält sie standardmäßig.
Per Design lehnt fetch das Promise nur bei Netzwerkausfällen wie DNS-Auflösungsfehlern oder verlorenen Verbindungen ab. HTTP-Fehlerstatuscodes wie 404 oder 500 werden als gültige Responses betrachtet. Sie müssen response.ok oder response.status selbst prüfen, bevor Sie den Body verarbeiten.
Ja, es gibt keinen Konflikt. Einige Teams verwenden natives fetch für einfache Anfragen und Axios dort, wo sie Interceptors oder automatisches Error-Throwing benötigen. Allerdings erhöht das Mischen von HTTP-Clients die Komplexität, daher wählen Sie eines als Standard und verwenden Sie das andere nur, wenn seine spezifischen Features benötigt werden.
Verwenden Sie undici direkt, wenn Sie Connection-Pooling, feinkörnige Kontrolle über HTTP-Verbindungen oder maximalen Durchsatz für wiederholte Anfragen an denselben Origin benötigen. Für typische API-Aufrufe, bei denen Einfachheit wichtiger ist als reine Performance, ist das globale fetch ausreichend.
Complete picture for complete understanding
Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.
Check our GitHub repo and join the thousands of developers in our community.