Signatur
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
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();
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');
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');
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());
// 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()- oderdeleteDatabase()-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
SecurityErrorabgelehnt. - 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 nutzennavigator.storage.estimate().