Start · Sprachen · JavaScript · Referenz · CrashReportContext.set()

CrashReportContext.set()

Methode

Speichert ein Schlüssel-Wert-Paar (Strings) im Speicher, der mit <code>initialize()</code> reserviert wurde. Die Daten werden bei einem Absturz im Crash-Report mitgesendet.

seit JavaScript Experimentell: nur Chromium-basierte Browser (Cras Kategorie: webapi

Signatur

CrashReportContext.prototype.set(key, value)

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

Typ
undefined
Beschreibung
Kein Rückgabewert. Wenn der Speicher nicht initialisiert ist oder das Paar nicht mehr in den reservierten Speicher passt, wird eine 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');
}
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);
{ app_version: '3.14.2', route: '/checkout' }

// 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 von initialize() 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 mit try…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 einem default-Endpunkt wird kein Crash-Bericht gesendet. Dann erreichen auch die gespeicherten Daten niemanden.