Signatur
Beschreibung
Das error-Ereignis tritt auf, wenn eine IDBRequest innerhalb einer Transaktion fehlschlägt, z. B. durch eine verletzte Eindeutigkeit (ConstraintError) bei add(). Das Ereignis wird zuerst auf der Anfrage ausgelöst und blubbert dann zur IDBTransaction und weiter zur IDBDatabase. Es ist ein einfaches Event mit bubbles: true und cancelable: true.
Mit einem Handler auf der Transaktion lassen sich Fehler zentral abfangen, statt an jede Anfrage einen eigenen onerror-Handler zu hängen. Den Handler registriert man mit transaction.addEventListener("error", handler) oder über die Eigenschaft transaction.onerror.
Wichtig: Wenn kein Handler event.preventDefault() aufruft, bricht die Transaktion standardmäßig ab. Alle Änderungen werden zurückgerollt, und anschließend wird das abort-Ereignis ausgelöst. Rufst du preventDefault() auf (auf der Anfrage oder in einem Handler weiter oben), läuft die Transaktion weiter und kann trotz des einzelnen Fehlers erfolgreich mit complete abschließen.
Das auslösende Objekt ist event.target, also die fehlgeschlagene IDBRequest. Das Fehlerobjekt steht in event.target.error als DOMException bereit.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname "error". |
|
| $handler Pflicht | (event: Event) => void | Callback mit einem Event. event.target ist die fehlgeschlagene IDBRequest, event.target.error die DOMException. |
|
| $options | boolean | AddEventListenerOptions | false | Optionen wie once, capture oder signal. |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler erhält ein Event, das die Transaktion abbrechen kann, wenn es nicht mit preventDefault() abgebrochen wird.Beispiele
Fehler zentral mit addEventListener abfangen
const openReq = indexedDB.open('shop', 1);
openReq.onupgradeneeded = () => {
openReq.result.createObjectStore('kunden', { keyPath: 'id' });
};
openReq.onsuccess = () => {
const db = openReq.result;
const tx = db.transaction('kunden', 'readwrite');
const store = tx.objectStore('kunden');
tx.addEventListener('error', (event) => {
const err = event.target.error;
console.log(`Transaktionsfehler: ${err.name}`);
});
tx.addEventListener('abort', () => console.log('Transaktion abgebrochen'));
store.add({ id: 1, name: 'Anna' });
store.add({ id: 1, name: 'Bernd' }); // gleicher Schlüssel, ConstraintError
};
Fehler tolerieren mit preventDefault() über onerror
const importiereKunden = (db, kunden) => new Promise((resolve, reject) => {
const tx = db.transaction('kunden', 'readwrite');
const store = tx.objectStore('kunden');
let uebersprungen = 0;
tx.onerror = (event) => {
if (event.target.error?.name === 'ConstraintError') {
event.preventDefault(); // Transaktion NICHT abbrechen
uebersprungen++;
}
};
tx.oncomplete = () => resolve(uebersprungen);
tx.onabort = () => reject(tx.error);
kunden.forEach((k) => store.add(k));
});
// Verwendung (db ist eine geöffnete IDBDatabase):
// const n = await importiereKunden(db, [{ id: 1 }, { id: 1 }, { id: 2 }]);
// console.log(`${n} Duplikat(e) übersprungen`);
Handler wieder entfernen
const tx = db.transaction('kunden', 'readwrite');
const onTxError = (event) => {
console.error('Fehler:', event.target.error.message);
};
tx.addEventListener('error', onTxError);
// später, z. B. wenn ein anderes Modul übernimmt:
tx.removeEventListener('error', onTxError);
// alternativ über die Eigenschaft zurücksetzen:
tx.onerror = null;
// Wichtig · Fallstricke
- Standardmäßiger Abbruch: Ohne
event.preventDefault()wird die gesamte Transaktion zurückgerollt, auch bereits erfolgreiche Schreibvorgänge. Danach folgtabort, nichtcomplete. - Bubbling: Ruft ein Handler an der Anfrage
event.stopPropagation()auf, erreicht das Ereignis die Transaktion nicht mehr. Der Abbruch passiert trotzdem, solange niemandpreventDefault()aufruft. event.targetvs.event.currentTarget:targetist die fehlgeschlageneIDBRequest,currentTargetdie Transaktion.transaction.errorist erst nach einem Abbruch gesetzt.- Nicht jeder Abbruch löst
erroraus: Ein manuellestransaction.abort()oder einQuotaExceededErrorbeim Commit meldet sich nur überabort. Deshalb sollte man immer auchabortabhören. - Browser-Kompatibilität: In allen modernen Browsern unterstützt. Im privaten Modus älterer Firefox-Versionen war IndexedDB teils nicht verfügbar.