Start · Sprachen · JavaScript · Referenz · IDBFactory.databases()

IDBFactory.databases()

Methode

Gibt ein Promise zurück, das mit einem Array von Objekten <code>{ name, version }</code> für alle IndexedDB-Datenbanken des aktuellen Ursprungs erfüllt wird.

seit JavaScript Baseline 2023: Chrome 71+, Edge 79+, Safari 14+, F Kategorie: webapi

Signatur

IDBFactory.prototype.databases()

Beschreibung

Mit indexedDB.databases() fragen Sie ab, welche IndexedDB-Datenbanken für den aktuellen Ursprung (Origin) vorhanden sind. Das Promise wird mit einem Array von Objekten erfüllt. Jedes Objekt hat die Eigenschaften name (Datenbankname als string) und version (Versionsnummer als number).

Die Methode ist nützlich für Werkzeuge zur Fehlersuche, zum Aufräumen alter oder verwaister Datenbanken (z. B. nach einer Schema-Migration mit neuem Datenbanknamen), für eine „Alle Daten löschen“-Funktion oder um zu prüfen, ob eine Datenbank schon existiert, ohne sie dabei versehentlich anzulegen. Ein indexedDB.open() würde eine nicht vorhandene Datenbank nämlich sofort erzeugen.

Das Ergebnis ist eine Momentaufnahme. Laufen parallel open()- oder deleteDatabase()-Anfragen (auch in anderen Tabs oder Workern), ist die Liste unter Umständen schon beim Auswerten veraltet. Die Methode steht in Fenstern und Workern zur Verfügung, typischerweise über das globale indexedDB.

Rückgabewert

Typ
Promise<Array<{ name: string, version: number }>>
Beschreibung
Ein Promise, das mit einem Array von Datenbank-Informationsobjekten erfüllt wird. Gibt es keine Datenbanken, ist das Array leer. Das Promise wird mit einem SecurityError (DOMException) abgelehnt, wenn der Ursprung keinen Speicherzugriff hat, etwa bei einem undurchsichtigen Ursprung wie data:-URLs oder Sandbox-iframes, oder wenn der Speicher durch Browsereinstellungen gesperrt ist.

Beispiele

Alle Datenbanken auflisten

const listDatabases = async () => {
  const dbs = await indexedDB.databases();
  if (dbs.length === 0) {
    console.log('Keine Datenbanken vorhanden.');
    return;
  }
  for (const { name, version } of dbs) {
    console.log(`${name} (Version ${version})`);
  }
};

listDatabases();
app-cache (Version 1) user-data (Version 3)

Prüfen, ob eine Datenbank existiert, ohne sie anzulegen

const databaseExists = async (dbName) => {
  const dbs = await indexedDB.databases();
  return dbs.some((db) => db.name === dbName);
};

const exists = await databaseExists('user-data');
console.log(exists ? 'Datenbank vorhanden' : 'Noch nicht angelegt');
Datenbank vorhanden

Veraltete Datenbanken nach einer Migration löschen

const deleteDb = (name) =>
  new Promise((resolve, reject) => {
    const req = indexedDB.deleteDatabase(name);
    req.onsuccess = () => resolve(name);
    req.onerror = () => reject(req.error);
    req.onblocked = () => console.warn(`${name}: Löschen blockiert (offene Verbindung)`);
  });

const cleanupOldDatabases = async (currentName) => {
  const dbs = await indexedDB.databases();
  const obsolete = dbs
    .map((db) => db.name)
    .filter((name) => name.startsWith('shop-v') && name !== currentName);
  const deleted = await Promise.all(obsolete.map(deleteDb));
  console.log('Gelöscht:', deleted);
};

cleanupOldDatabases('shop-v3');
Gelöscht: ['shop-v1', 'shop-v2']

Mit Funktionsprüfung und Fehlerbehandlung

const safeListDatabases = async () => {
  if (typeof indexedDB?.databases !== 'function') {
    console.warn('indexedDB.databases() wird nicht unterstützt.');
    return [];
  }
  try {
    return await indexedDB.databases();
  } catch (err) {
    console.error('Zugriff verweigert:', err.name);
    return [];
  }
};

console.log(await safeListDatabases());
[{ name: 'user-data', version: 3 }]

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Firefox unterstützt die Methode erst ab Version 126. Ältere Firefox-Versionen kennen sie nicht. Prüfen Sie deshalb vorher mit typeof indexedDB.databases === 'function', ob sie vorhanden ist.
  • Momentaufnahme: Die Liste kann durch gleichzeitige open()- oder deleteDatabase()-Aufrufe (auch aus anderen Tabs oder Workern) schon beim Auswerten veraltet sein. Verlassen Sie sich darauf nicht für kritische Logik.
  • Nur eigener Ursprung: Sie sehen ausschließlich die Datenbanken des aktuellen Ursprungs, niemals die fremder Websites. Im privaten Modus oder bei gesperrtem Speicher kann die Liste leer sein, oder das Promise wird mit SecurityError abgelehnt.
  • Datenbanken, die gerade angelegt werden, deren Upgrade also noch läuft, tauchen je nach Browser unter Umständen noch nicht auf.
  • Die Methode liefert keine Angaben zu Object Stores oder zur Größe. Dafür öffnen Sie die Datenbank (db.objectStoreNames) oder nutzen navigator.storage.estimate().