Start · Sprachen · JavaScript · Referenz · IDBTransaction.objectStoreNames

IDBTransaction.objectStoreNames

Eigenschaft

Schreibgeschützte Eigenschaft, die eine <code>DOMStringList</code> mit den Namen aller Objektspeicher im Geltungsbereich der Transaktion liefert.

seit JavaScript Baseline: in allen modernen Browsern breit verfügb Kategorie: webapi

Signatur

IDBTransaction.objectStoreNames

Beschreibung

Die Eigenschaft objectStoreNames einer IDBTransaction gibt eine DOMStringList zurück. Sie enthält die Namen aller IDBObjectStore-Objekte, die zum Geltungsbereich (engl. scope) der Transaktion gehören. Das sind genau die Speicher, die du beim Aufruf von IDBDatabase.transaction(storeNames, mode) angegeben hast.

Bei einer versionchange-Transaktion, also im upgradeneeded-Handler, sieht das anders aus: Hier umfasst die Transaktion automatisch alle Objektspeicher der Datenbank. Die Liste zeigt dann auch Speicher, die während des Upgrades mit createObjectStore() angelegt wurden. Mit deleteObjectStore() entfernte Speicher sind nicht mehr enthalten.

Nützlich ist die Eigenschaft vor allem in generischem Code, der eine Transaktion übergeben bekommt. Damit lässt sich vorab prüfen, ob ein bestimmter Speicher zugänglich ist, bevor man transaction.objectStore(name) aufruft. Ist der Speicher nicht im Geltungsbereich, wirft dieser Aufruf einen NotFoundError. Die Namen stehen in aufsteigend sortierter Reihenfolge in der Liste.

Rückgabewert

Typ
DOMStringList
Beschreibung
Eine sortierte Liste mit den Namen der Objektspeicher im Geltungsbereich der Transaktion. Sie hat die Eigenschaft length und die Methoden item(index) und contains(name). Sie ist kein Array.

Beispiele

Namen der Speicher einer Lese-Transaktion ausgeben

const request = indexedDB.open('shop', 1);

request.onupgradeneeded = () => {
  const db = request.result;
  db.createObjectStore('produkte', { keyPath: 'id' });
  db.createObjectStore('kunden', { keyPath: 'id' });
  db.createObjectStore('bestellungen', { keyPath: 'id' });
};

request.onsuccess = () => {
  const db = request.result;
  const tx = db.transaction(['produkte', 'kunden'], 'readonly');

  // DOMStringList in ein echtes Array umwandeln
  const namen = Array.from(tx.objectStoreNames);
  console.log(namen);
  console.log(tx.objectStoreNames.length);
};
["kunden", "produkte"] 2

Im Upgrade-Handler nur fehlende Speicher anlegen

const request = indexedDB.open('notizen', 2);

request.onupgradeneeded = (event) => {
  const db = request.result;
  const tx = event.target.transaction; // versionchange-Transaktion

  if (!tx.objectStoreNames.contains('eintraege')) {
    db.createObjectStore('eintraege', { autoIncrement: true });
  }
  if (!tx.objectStoreNames.contains('tags')) {
    db.createObjectStore('tags', { keyPath: 'name' });
  }

  // Neu angelegte Speicher erscheinen sofort in der Liste
  console.log([...tx.objectStoreNames]);
};
["eintraege", "tags"]

Sicherer Zugriff auf einen Speicher in generischem Code

// Hilfsfunktion: liefert den Speicher oder null statt eines NotFoundError
const getStoreSafe = (tx, name) =>
  tx.objectStoreNames.contains(name) ? tx.objectStore(name) : null;

const zaehleEintraege = (db, name) =>
  new Promise((resolve, reject) => {
    const tx = db.transaction(db.objectStoreNames, 'readonly');
    const store = getStoreSafe(tx, name);
    if (!store) {
      resolve(0);
      return;
    }
    const req = store.count();
    req.onsuccess = () => resolve(req.result);
    req.onerror = () => reject(req.error);
  });

// Aufruf (db aus indexedDB.open):
// const anzahl = await zaehleEintraege(db, 'produkte');

// Wichtig · Fallstricke

  • Kein Array: DOMStringList hat keine Methoden wie includes(), map() oder filter(). Verwende contains() oder wandle die Liste mit Array.from() bzw. dem Spread-Operator um.
  • Geltungsbereich statt ganzer Datenbank: Bei readonly- und readwrite-Transaktionen stehen nur die angefragten Speicher in der Liste. Alle Speicher der Datenbank liefert IDBDatabase.objectStoreNames.
  • Wird ein Upgrade abgebrochen (abort()), wird die Liste auf den Stand vor dem Upgrade zurückgesetzt.
  • DOMStringList gibt es praktisch nur noch aus Kompatibilitätsgründen. In neuen APIs werden stattdessen Arrays verwendet.
  • Kompatibilität: Wird von allen aktuellen Browsern unterstützt, auch in Web Workern. Ältere Safari-Versionen hatten Lücken bei IndexedDB. Für sehr alte Browser lohnt sich deshalb eine Prüfung per Feature-Erkennung.