Signatur
Beschreibung
Die Eigenschaft status eines Response-Objekts gibt den HTTP-Statuscode zurück, den der Server gesendet hat. Das ist eine ganze Zahl, meist zwischen 200 und 599. Beispiele sind 200 (OK), 201 (Created), 204 (No Content), 404 (Not Found) oder 500 (Internal Server Error).
Wichtig: fetch() wird bei HTTP-Fehlercodes wie 404 oder 500 nicht abgelehnt. Das Promise wird nur bei Netzwerkfehlern, CORS-Verstößen oder einem Abbruch abgelehnt. Deshalb muss man status (oder ok) selbst prüfen, um Fehlerantworten zu erkennen und gezielt zu behandeln.
Oft reicht die Kurzform response.ok. Sie ist true, wenn status im Bereich 200–299 liegt. status selbst braucht man, wenn einzelne Codes unterschiedlich behandelt werden sollen, etwa 401 für eine erneute Anmeldung, 429 für Wiederholungen mit Wartezeit oder 204, wenn kein Body kommt.
Bei selbst erzeugten Antworten, etwa in einem Service Worker, legt man den Wert über das Optionsobjekt des Konstruktors fest: new Response(body, { status: 404 }). Ohne Angabe ist der Standardwert 200.
Rückgabewert
200, 404). Bei opaken Antworten (type: "opaque" oder "opaqueredirect") und bei Response.error() ist der Wert 0.Beispiele
Statuscode einer Anfrage prüfen
const response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
console.log(response.status); // numerischer Code
console.log(response.statusText); // Textbeschreibung (bei HTTP/2 oft leer)
console.log(response.ok); // true bei 200–299
Verschiedene Statuscodes gezielt behandeln
const ladeBenutzer = async (id) => {
const response = await fetch(`/api/users/${id}`);
switch (response.status) {
case 200:
return response.json();
case 204:
return null; // kein Inhalt, response.json() würde fehlschlagen
case 401:
window.location.href = '/login';
return null;
case 404:
throw new Error(`Benutzer ${id} nicht gefunden`);
default:
if (response.status >= 500) {
throw new Error(`Serverfehler (${response.status})`);
}
throw new Error(`Unerwarteter Status: ${response.status}`);
}
};
try {
const user = await ladeBenutzer(42);
console.log(user);
} catch (err) {
console.error(err.message);
}
Bei 429/503 mit Wartezeit erneut versuchen
const fetchMitRetry = async (url, versuche = 3) => {
for (let i = 0; i < versuche; i++) {
const response = await fetch(url);
if (response.status !== 429 && response.status !== 503) {
return response;
}
// Retry-After-Header in Sekunden auswerten, sonst exponentiell warten
const retryAfter = Number(response.headers.get('Retry-After')) || 2 ** i;
console.log(`Status ${response.status}, neuer Versuch in ${retryAfter}s`);
await new Promise((r) => setTimeout(r, retryAfter * 1000));
}
throw new Error('Zu viele Versuche');
};
const res = await fetchMitRetry('/api/daten');
console.log(res.status);
Eigenen Status in einem Service Worker setzen
self.addEventListener('fetch', (event) => {
if (new URL(event.request.url).pathname === '/api/offline-test') {
const antwort = new Response(JSON.stringify({ fehler: 'offline' }), {
status: 503,
statusText: 'Service Unavailable',
headers: { 'Content-Type': 'application/json' },
});
console.log(antwort.status); // 503
event.respondWith(antwort);
}
});
// Wichtig · Fallstricke
- Kein automatischer Fehler:
fetch()wird bei4xx/5xxnicht abgelehnt. Prüfen Sie immerresponse.okoderresponse.status, bevor Sie den Body verarbeiten. - Status 0: Bei
mode: "no-cors"(opake Antwort), beiredirect: "manual"(opaqueredirect) und beiResponse.error()iststatus0. Der echte Code ist aus Sicherheitsgründen nicht einsehbar. - Weiterleitungen: Mit dem Standardwert
redirect: "follow"sieht man nie301/302, sondern den Status des endgültigen Ziels. Ob weitergeleitet wurde, zeigtresponse.redirected. - Schreibgeschützt: Eine Zuweisung an
response.statuswird ignoriert und wirft im Strict Mode einenTypeError. Einen anderen Status setzt man nur übernew Response(body, { status }). - Gültiger Wertebereich im Konstruktor:
statusmuss zwischen200und599liegen, sonst wirft der Konstruktor einenRangeError. Bei101,103,204,205und304ist kein Body erlaubt (TypeError). - statusText: Unter HTTP/2 und HTTP/3 ist
statusTextmeist leer. Verlassen Sie sich deshalb auf den numerischenstatus. - Kompatibilität: Wird von allen modernen Browsern unterstützt, ebenso von Web Workern und Service Workern, Node.js ab Version 18 (globales
fetch), Deno und Bun.