Signatur
Beschreibung
Die schreibgeschützte Eigenschaft ok des Response-Interfaces ist true, wenn response.status zwischen 200 und 299 (einschließlich) liegt, andernfalls false. Sie ist eine bequeme Kurzform für response.status >= 200 && response.status <= 299.
Das ist wichtig, weil fetch() nicht bei HTTP-Fehlerstatus wie 404 oder 500 abgelehnt wird. Das Promise wird nur bei Netzwerkfehlern, CORS-Verletzungen oder einem Abbruch per AbortSignal abgelehnt. Deshalb solltest du response.ok nach jedem fetch() prüfen, bevor du den Body mit json(), text() o. Ä. weiterverarbeitest.
Typisches Muster: Ist ok gleich false, wird ein eigener Fehler geworfen (gern mit status und statusText), damit Fehler zentral in einem try…catch behandelt werden können.
Rückgabewert
true bei einem Statuscode von 200–299, sonst false (auch bei 3xx, 4xx, 5xx und bei opaken Antworten mit Status 0).Beispiele
Einfache Prüfung nach fetch()
const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
console.log(response.status, response.ok);
const missing = await fetch('https://jsonplaceholder.typicode.com/todos/999999');
console.log(missing.status, missing.ok);
Wiederverwendbare Hilfsfunktion mit Fehlerbehandlung
const fetchJson = async (url, options = {}) => {
const response = await fetch(url, options);
if (!response.ok) {
// Fehlertext des Servers mitnehmen, falls vorhanden
const body = await response.text().catch(() => '');
throw new Error(`HTTP ${response.status} ${response.statusText}: ${body}`);
}
return response.json();
};
try {
const user = await fetchJson('https://jsonplaceholder.typicode.com/users/1');
console.log(user.name);
} catch (err) {
console.error('Laden fehlgeschlagen:', err.message);
}
Response-Objekte selbst erzeugen (z. B. in Tests oder Service Workern)
const created = new Response('{}', { status: 201 });
const notModified = new Response(null, { status: 304 });
const serverError = new Response('Fehler', { status: 500 });
console.log(created.ok, notModified.ok, serverError.ok);
Netzwerkfehler vs. HTTP-Fehler unterscheiden
const loadConfig = async () => {
let response;
try {
response = await fetch('/api/config');
} catch (err) {
// Nur hier landen echte Netzwerk-/CORS-Fehler
return { error: 'Netzwerkfehler', detail: err.message };
}
if (!response.ok) {
return { error: 'Serverfehler', status: response.status };
}
return { data: await response.json() };
};
loadConfig().then(console.log);
// Wichtig · Fallstricke
- fetch() lehnt bei 4xx/5xx nicht ab: Ohne Prüfung von
okwird z. B. eine HTML-Fehlerseite anresponse.json()übergeben, was dann mit einem verwirrendenSyntaxErrorscheitert. - Weiterleitungen:
fetch()folgt Weiterleitungen standardmäßig (redirect: 'follow');okbezieht sich dann auf die finale Antwort. Mitredirect: 'manual'erhältst du eineopaqueredirect-Antwort mit Status0undok === false. - Opake Antworten: Bei
mode: 'no-cors'istresponse.type === 'opaque',statusist0undokimmerfalse– auch wenn der Server eigentlich erfolgreich geantwortet hat. 304 Not Modifiedund andere3xx-Codes gelten als nicht ok.- Die Eigenschaft ist schreibgeschützt; Zuweisungen werden ignoriert (im Strict Mode
TypeError). - Kompatibilität: in allen modernen Browsern verfügbar, in Node.js ab Version 18 global (vorher über
node-fetch). Nicht im Internet Explorer.