Signatur
Beschreibung
Die Methode set() der Schnittstelle CrashReportContext legt einen Eintrag aus Schlüssel und Wert in einem kleinen, vom Browser verwalteten Speicherbereich ab. Diesen Bereich muss man vorher mit initialize() anlegen. Stürzt der Renderer-Prozess der Seite ab, zum Beispiel wegen Speichermangel (OOM) oder eines Absturzes im Browser selbst, hängt der Browser die gespeicherten Paare an den crash-Bericht der Reporting API an. Der Bericht geht an den Endpunkt, der im HTTP-Header Reporting-Endpoints als default eingetragen ist.
Wichtig ist das deshalb, weil JavaScript bei einem Absturz keine Gelegenheit mehr hat, Daten zu senden. Deshalb hält man den aktuellen Zustand der Anwendung fortlaufend mit set() aktuell, etwa die aktive Route, ein gerade laufendes Feature, die Build-Version oder einen Zähler für große Objekte. So lassen sich Absturzberichte später einer bestimmten Situation zuordnen.
Wird ein vorhandener Schlüssel erneut gesetzt, überschreibt das den alten Wert. Mit delete() entfernt man einen Eintrag wieder. Die Methode arbeitet synchron. Man kann sie daher oft und ohne await aufrufen, sobald die Initialisierung abgeschlossen ist.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $key Pflicht | string | Name des Eintrags, z. B. "route". Werte, die kein String sind, werden in einen String umgewandelt. |
|
| $value Pflicht | string | Wert des Eintrags. Er wird als String gespeichert. Strukturierte Daten muss man vorher selbst serialisieren, z. B. mit JSON.stringify(). |
Rückgabewert
DOMException geworfen.Beispiele
Speicher initialisieren und Kontext setzen
// Speicher für Absturz-Kontextdaten reservieren (Größe in Bytes)
if ('crashReport' in window) {
await window.crashReport.initialize(1024);
window.crashReport.set('app_version', '3.14.2');
window.crashReport.set('route', location.pathname);
console.log('Crash-Kontext gesetzt');
}
Zustand fortlaufend aktualisieren (SPA-Routing)
const crashCtx = window.crashReport;
let ready = false;
crashCtx?.initialize(2048).then(() => { ready = true; });
const updateCrashContext = (key, value) => {
if (!ready) return;
try {
crashCtx.set(key, String(value));
} catch (err) {
console.warn('Crash-Kontext nicht gespeichert:', err.name);
}
};
// Bei jedem Routenwechsel den alten Wert überschreiben
window.addEventListener('popstate', () => {
updateCrashContext('route', location.pathname);
});
Strukturierte Daten serialisieren und wieder entfernen
await window.crashReport.initialize(4096);
const startEditor = (doc) => {
// Objekte müssen als String gespeichert werden
window.crashReport.set('editor', JSON.stringify({ docId: doc.id, pages: doc.pages }));
};
const stopEditor = () => {
// Eintrag entfernen, sobald der Kontext nicht mehr gilt
window.crashReport.delete('editor');
};
startEditor({ id: 'a17', pages: 240 });
stopEditor();
Server: Crash-Bericht mit Kontextdaten empfangen
// HTTP-Antwort-Header der Seite:
// Reporting-Endpoints: default="https://example.com/reports"
// Node.js/Express-Endpunkt (vereinfacht)
import express from 'express';
const app = express();
app.use(express.json({ type: 'application/reports+json' }));
app.post('/reports', (req, res) => {
for (const report of req.body) {
if (report.type === 'crash') {
console.log(report.body.crash_report_api);
}
}
res.sendStatus(204);
});
app.listen(3000);
// Wichtig · Fallstricke
- Experimentell: Die API wird bisher nur in Chromium-basierten Browsern unterstützt und ist noch nicht standardisiert. Prüfen Sie vorher, ob sie verfügbar ist, z. B. mit
'crashReport' in window. Firefox und Safari unterstützen sie nicht. - Erst initialisieren:
set()funktioniert erst, wenn das Promise voninitialize()erfüllt ist. Ein früherer Aufruf löst eine Ausnahme aus. - Begrenzter Speicher: Schlüssel und Werte teilen sich die mit
initialize()festgelegte Größe, und der Browser setzt dafür eine Obergrenze. Große oder schnell wachsende Werte können eine Ausnahme auslösen. Umschließen Sie Aufrufe deshalb mittry…catch. - Nur Strings: Objekte werden ohne vorheriges
JSON.stringify()zu\"[object Object]\". - Datenschutz: Die Daten gehen an Ihren Reporting-Endpunkt. Speichern Sie keine personenbezogenen Daten, Tokens oder Passwörter.
- Ohne einen
Reporting-Endpoints-Header mit einemdefault-Endpunkt wird kein Crash-Bericht gesendet. Dann erreichen auch die gespeicherten Daten niemanden.