Start · Sprachen · JavaScript · Referenz · IDBRequest.source

IDBRequest.source

Eigenschaft

Schreibgeschützte Eigenschaft, die das Objekt liefert, von dem die Anfrage ausging: <code>IDBObjectStore</code>, <code>IDBIndex</code>, <code>IDBCursor</code> oder <code>null</code>.

seit JavaScript Baseline: alle Browser (IndexedDB 2.0) Kategorie: webapi

Signatur

get IDBRequest.source

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 wie store.get(), store.put(), store.add(), store.delete() oder store.openCursor().
  • IDBIndex – bei Anfragen über einen Index, z. B. index.get(), index.getAll() oder index.openCursor().
  • IDBCursor – bei cursor.update() und cursor.delete().
  • null – bei IDBOpenDBRequest, also bei indexedDB.open() und indexedDB.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

Typ
IDBObjectStore | IDBIndex | IDBCursor | null
Beschreibung
Das Objekt, von dem die Anfrage ausging, oder 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);
  };
};
Quelle von open(): null true produkte

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
};
Fehler bei Store "produkte": ConstraintError

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();
};
openCursor-Quelle: IDBIndex update-Quelle: IDBCursorWithValue

// Wichtig · Fallstricke

  • Nicht mit dem Ergebnis verwechseln: Bei openCursor() ist request.source der Store bzw. Index, nicht der Cursor – den Cursor liefert request.result. Erst bei cursor.update()/cursor.delete() ist die Quelle ein IDBCursor.
  • Bei IDBOpenDBRequest (indexedDB.open(), deleteDatabase()) ist source immer null. Das Prüfen mit instanceof vor dem Zugriff auf source.name vermeidet TypeErrors.
  • Die Eigenschaft ist schreibgeschützt; Zuweisungen werden ignoriert (im Strict Mode gibt es einen TypeError).
  • Anders als result und error kann source schon gelesen werden, solange die Anfrage noch den Status "pending" hat; es wird keine InvalidStateError-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.