Signatur
Beschreibung
Jede asynchrone Operation in IndexedDB gibt ein IDBRequest zurück. Über request.source lässt sich herausfinden, welches Objekt die Anfrage erzeugt hat. Die Eigenschaft ist schreibgeschützt und behält ihren Wert während der ganzen Lebensdauer der Anfrage.
Möglich sind folgende Werte:
IDBObjectStore– bei Aufrufen wiestore.get(),store.put(),store.add(),store.delete()oderstore.openCursor().IDBIndex– bei Anfragen über einen Index, z. B.index.get(),index.getAll()oderindex.openCursor().IDBCursor– beicursor.update()undcursor.delete().null– beiIDBOpenDBRequest, also beiindexedDB.open()undindexedDB.deleteDatabase().
Nützlich ist das vor allem bei gemeinsamen Event-Handlern, die an viele Anfragen gehängt werden – etwa für Logging, Fehlerberichte oder generische Hilfsfunktionen, die wissen müssen, auf welchem Store oder Index eine Operation lief. So spart man sich zusätzliche Closures, die den Kontext festhalten.
Rückgabewert
null, wenn die Anfrage keine Quelle hat (z. B. indexedDB.open()).Beispiele
Quelle einer einfachen get-Anfrage ermitteln
const openReq = indexedDB.open('shop', 1);
openReq.onupgradeneeded = () => {
const db = openReq.result;
const store = db.createObjectStore('produkte', { keyPath: 'id' });
store.createIndex('nachName', 'name');
};
openReq.onsuccess = () => {
console.log('Quelle von open():', openReq.source);
const db = openReq.result;
const tx = db.transaction('produkte', 'readonly');
const req = tx.objectStore('produkte').get(1);
req.onsuccess = (event) => {
const quelle = event.target.source;
console.log(quelle instanceof IDBObjectStore, quelle.name);
};
};
Gemeinsamer Fehler-Handler mit Kontextangabe
const beschreibeQuelle = (source) => {
if (source instanceof IDBIndex) {
return `Index "${source.name}" in Store "${source.objectStore.name}"`;
}
if (source instanceof IDBObjectStore) {
return `Store "${source.name}"`;
}
if (source instanceof IDBCursor) {
return `Cursor auf "${source.source.name}"`;
}
return 'Datenbank (keine Quelle)';
};
const logFehler = (event) => {
const req = event.target;
console.error(`Fehler bei ${beschreibeQuelle(req.source)}:`, req.error?.name);
};
// Verwendung (db ist eine geöffnete IDBDatabase):
const tx = db.transaction('produkte', 'readwrite');
const store = tx.objectStore('produkte');
const req = store.add({ id: 1, name: 'Tasse' }); // id existiert bereits
req.onerror = (event) => {
logFehler(event);
event.preventDefault(); // Transaktion nicht abbrechen
};
Cursor-Update: Quelle ist der Cursor selbst
const tx = db.transaction('produkte', 'readwrite');
const index = tx.objectStore('produkte').index('nachName');
const cursorReq = index.openCursor();
cursorReq.onsuccess = () => {
const cursor = cursorReq.result;
if (!cursor) return;
console.log('openCursor-Quelle:', cursorReq.source.constructor.name);
const updateReq = cursor.update({ ...cursor.value, geprueft: true });
updateReq.onsuccess = () => {
console.log('update-Quelle:', updateReq.source.constructor.name);
};
cursor.continue();
};
// Wichtig · Fallstricke
- Nicht mit dem Ergebnis verwechseln: Bei
openCursor()istrequest.sourceder Store bzw. Index, nicht der Cursor – den Cursor liefertrequest.result. Erst beicursor.update()/cursor.delete()ist die Quelle einIDBCursor. - Bei
IDBOpenDBRequest(indexedDB.open(),deleteDatabase()) istsourceimmernull. Das Prüfen mitinstanceofvor dem Zugriff aufsource.namevermeidetTypeErrors. - Die Eigenschaft ist schreibgeschützt; Zuweisungen werden ignoriert (im Strict Mode gibt es einen
TypeError). - Anders als
resultunderrorkannsourceschon gelesen werden, solange die Anfrage noch den Status"pending"hat; es wird keineInvalidStateError-Exception ausgelöst. - Kompatibilität: in allen modernen Browsern und in Web Workern verfügbar. Im privaten Modus älterer Browser (z. B. Firefox vor Version 115) war IndexedDB teils nicht nutzbar.