Signatur
Beschreibung
IDBRequest.error enthält den Grund, warum eine asynchrone IndexedDB-Operation gescheitert ist, z. B. add(), get(), put() oder indexedDB.open(). Die Eigenschaft ist schreibgeschützt. Wenn die Anforderung fehlschlägt, steht hier eine DOMException. Wenn sie erfolgreich war, ist der Wert null.
Normalerweise liest man die Eigenschaft im error-Handler der Anforderung aus, also über request.onerror oder request.addEventListener("error", …). Über error.name lässt sich die Fehlerursache unterscheiden. Häufige Werte sind:
ConstraintError: Ein Eindeutigkeits-Constraint wurde verletzt, etwa beiadd()mit einem Schlüssel, den es schon gibt, oder bei einem eindeutigen Index.QuotaExceededError: Der verfügbare Speicherplatz reicht nicht aus.AbortError: Die Transaktion wurde abgebrochen, bevor die Anforderung fertig war.VersionError:open()wurde mit einer kleineren Version als der vorhandenen aufgerufen.DataError,NotFoundError,UnknownError: Der Schlüssel ist ungültig, ein Objektspeicher fehlt, oder es gab einen internen bzw. I/O-Fehler.
Die Eigenschaft darf erst gelesen werden, wenn die Anforderung abgeschlossen ist, also wenn readyState === "done" gilt. Ein Zugriff davor löst eine InvalidStateError-DOMException aus.
Rückgabewert
DOMException mit name und message, wenn die Anforderung fehlgeschlagen ist, sonst null.Beispiele
Doppelten Schlüssel bei add() erkennen
const openReq = indexedDB.open('shop', 1);
openReq.onupgradeneeded = () => {
openReq.result.createObjectStore('kunden', { keyPath: 'id' });
};
openReq.onsuccess = () => {
const db = openReq.result;
const store = db.transaction('kunden', 'readwrite').objectStore('kunden');
store.add({ id: 1, name: 'Anna' });
const req = store.add({ id: 1, name: 'Bernd' }); // gleicher Schlüssel
req.onerror = (event) => {
console.log(req.error.name);
// Standardverhalten verhindern, damit die Transaktion nicht abbricht
event.preventDefault();
};
};
Fehler beim Öffnen der Datenbank auswerten
const req = indexedDB.open('meineDB', 1);
req.addEventListener('error', () => {
const { name, message } = req.error;
if (name === 'VersionError') {
console.warn('Vorhandene Datenbank ist neuer:', message);
} else {
console.error(`Öffnen fehlgeschlagen (${name}): ${message}`);
}
});
req.addEventListener('success', () => {
console.log('Fehler:', req.error); // bei Erfolg null
});
IDBRequest in ein Promise einpacken
const promisify = (request) =>
new Promise((resolve, reject) => {
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
const speichern = async (db, eintrag) => {
const store = db.transaction('notizen', 'readwrite').objectStore('notizen');
try {
return await promisify(store.put(eintrag));
} catch (err) {
if (err.name === 'QuotaExceededError') {
console.error('Speicher voll – bitte alte Notizen löschen.');
}
throw err;
}
};
// Wichtig · Fallstricke
- InvalidStateError: Wenn man
errorliest, solangereadyStatenoch"pending"ist, wird eine Ausnahme ausgelöst. Deshalb liest man die Eigenschaft nur in densuccess- odererror-Handlern. - Fehler wandern nach oben: Ein
error-Ereignis bubbelt von der Anforderung zurIDBTransactionund dann zurIDBDatabase. Wenn niemandevent.preventDefault()aufruft, wird die ganze Transaktion abgebrochen. Danach melden auch andere offene Anforderungen dieser Transaktion einenAbortError. - Veraltet: DOMError. Ältere Browser haben ein
DOMError-Objekt statt einerDOMExceptiongeliefert. Vergleiche deshalb immer übererror.nameund nicht überinstanceofoder numerische Codes. - Bei
QuotaExceededErrorlohnt sich ein Blick aufnavigator.storage.estimate()undnavigator.storage.persist(). - Im privaten Modus mancher Browser kann
indexedDB.open()mit einemUnknownErroroderInvalidStateErrorfehlschlagen. Plane dafür einen Ersatzweg ein.