Signatur
Beschreibung
Die Eigenschaft Request.mode gibt an, nach welchen Regeln ein Request ursprungsübergreifend (Cross-Origin) behandelt wird. Der Modus bestimmt, ob eine Anfrage an eine fremde Herkunft überhaupt erlaubt ist, ob CORS-Header ausgewertet werden und ob die Antwort für JavaScript lesbar ist.
"cors": Cross-Origin-Anfragen sind erlaubt, sofern der Server passende CORS-Header sendet. Standard fürnew Request()undfetch()."no-cors": Nur „einfache“ Methoden (GET,HEAD,POST) und sichere Header sind zulässig. Die Antwort ist opaque (response.type === "opaque"): Status, Header und Body sind nicht lesbar."same-origin": Anfragen an eine fremde Herkunft schlagen mit einemTypeErrorfehl."navigate": Nur bei Seitennavigationen durch den Browser. Kann nicht selbst gesetzt werden, taucht aber z. B. imfetch-Event eines Service Workers auf.
Gesetzt wird der Modus über die Option mode im Konstruktor new Request(url, { mode }) oder direkt in fetch(url, { mode }). Die Eigenschaft selbst ist nur lesbar. Besonders nützlich ist sie in Service Workern: Dort unterscheidet man damit Navigationsanfragen (HTML-Seiten) von Anfragen nach Ressourcen wie Skripten oder Bildern.
Rückgabewert
"cors".Beispiele
Standardmodus und explizit gesetzter Modus
const standard = new Request('https://api.example.com/daten');
console.log(standard.mode);
const lokal = new Request('/api/profil', { mode: 'same-origin' });
console.log(lokal.mode);
Service Worker: Navigationen gesondert behandeln (Offline-Fallback)
// sw.js
self.addEventListener('fetch', (event) => {
if (event.request.mode === 'navigate') {
event.respondWith(
(async () => {
try {
return await fetch(event.request);
} catch {
const cache = await caches.open('offline-v1');
return cache.match('/offline.html');
}
})()
);
}
});
no-cors liefert eine undurchsichtige Antwort
const req = new Request('https://fremde-domain.example/pixel.gif', { mode: 'no-cors' });
console.log(req.mode);
const res = await fetch(req);
console.log(res.type, res.status, res.ok);
same-origin blockiert fremde Herkunft
try {
await fetch('https://andere-domain.example/api', { mode: 'same-origin' });
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- Kein CORS-Umweg:
"no-cors"umgeht CORS nicht. Die Antwort ist opaque:statusist0, Header und Body sind nicht zugänglich. Sinnvoll ist der Modus nur zum Cachen im Service Worker oder für Anfragen, bei denen man die Antwort nicht auswerten muss. - Einschränkungen bei no-cors: Nur
GET,HEADundPOSTsowie CORS-sichere Header (z. B.Content-Typenur mit einfachen Werten) sind erlaubt. Andere Methoden führen zu einemTypeError. - navigate ist nicht setzbar:
new Request(url, { mode: 'navigate' })wirft einenTypeError. Erstellt man aus einer Navigationsanfrage mitnew Request(request)eine neue Anfrage, wird der Modus zu"same-origin". - Opaque-Antworten im Cache: Sie belegen in Chromium aus Sicherheitsgründen deutlich mehr Speicherkontingent (Padding), als ihre tatsächliche Größe beträgt.
- Kompatibilität: Wird von allen modernen Browsern unterstützt. In Node.js ist die Eigenschaft ab Version 18 vorhanden (undici). Da es dort keine Same-Origin-Policy gibt, hat sie in Node.js kaum Wirkung.