Start · Sprachen · JavaScript · Referenz · IDBObjectStore.get()

IDBObjectStore.get()

Methode

Liest asynchron den Datensatz zum angegebenen Schlüssel bzw. Schlüsselbereich aus einem Object Store und liefert ein <code>IDBRequest</code>, dessen <code>result</code> den Wert enthält.

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

Signatur

IDBObjectStore.prototype.get(key)

Beschreibung

get() ist die einfachste Leseoperation in IndexedDB: Du übergibst einen Primärschlüssel (oder einen IDBKeyRange) und erhältst ein IDBRequest-Objekt. Die eigentliche Suche läuft asynchron. Ist sie abgeschlossen, wird das success-Ereignis ausgelöst, und request.result enthält eine strukturierte Kopie (Structured Clone) des gespeicherten Werts.

Wird ein Schlüsselbereich übergeben, liefert get() den ersten passenden Datensatz in Schlüsselreihenfolge. Gibt es keinen Treffer, ist result undefined. Das ist kein Fehler, success wird trotzdem ausgelöst.

Die Methode muss innerhalb einer aktiven Transaktion ("readonly" oder "readwrite") aufgerufen werden, die den Store in ihrem Geltungsbereich hat. Für mehrere Datensätze nutzt du getAll(), zum Prüfen auf Existenz ohne den Wert zu laden getKey() oder count(). Suchen über Nicht-Primärschlüssel laufen über IDBIndex.get().

Parameter

Name Typ Default Beschreibung
$key Pflicht any (gültiger IndexedDB-Schlüssel: number | string | Date | ArrayBuffer | Array) | IDBKeyRange Primärschlüssel des gesuchten Datensatzes oder ein IDBKeyRange. Bei einem Bereich wird der erste passende Datensatz zurückgegeben.

Rückgabewert

Typ
IDBRequest<any>
Beschreibung
Ein IDBRequest. Nach dem success-Ereignis enthält request.result den gefundenen Wert (strukturierte Kopie) oder undefined, wenn kein Datensatz passt.

Beispiele

Einzelnen Datensatz per Primärschlüssel lesen

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

openReq.onupgradeneeded = () => {
  const db = openReq.result;
  const store = db.createObjectStore('produkte', { keyPath: 'id' });
  store.put({ id: 42, name: 'Kaffeemühle', preis: 49.9 });
};

openReq.onsuccess = () => {
  const db = openReq.result;
  const tx = db.transaction('produkte', 'readonly');
  const request = tx.objectStore('produkte').get(42);

  request.onsuccess = () => {
    console.log(request.result);
  };
  request.onerror = () => {
    console.error('Lesefehler:', request.error);
  };
};
{ id: 42, name: 'Kaffeemühle', preis: 49.9 }

Promise-Wrapper für async/await

const promisify = (request) =>
  new Promise((resolve, reject) => {
    request.onsuccess = () => resolve(request.result);
    request.onerror = () => reject(request.error);
  });

const ladeProdukt = async (db, id) => {
  const store = db.transaction('produkte').objectStore('produkte');
  const produkt = await promisify(store.get(id));
  return produkt ?? null; // undefined = nicht gefunden
};

// Verwendung:
// const produkt = await ladeProdukt(db, 42);
// console.log(produkt?.name ?? 'Nicht vorhanden');
Kaffeemühle

Ersten Datensatz in einem Schlüsselbereich lesen

const ersterAb = (db, minId) => {
  const store = db.transaction('produkte').objectStore('produkte');
  // Erster Datensatz mit id >= minId
  const request = store.get(IDBKeyRange.lowerBound(minId));
  request.onsuccess = () => {
    console.log(request.result ? `Gefunden: ${request.result.name}` : 'Kein Treffer');
  };
};

// ersterAb(db, 40);
Gefunden: Kaffeemühle

// Wichtig · Fallstricke

  • Nicht gefunden ≠ Fehler: Fehlt der Schlüssel, ist result undefined. Wurde ausdrücklich undefined gespeichert (bei Stores ohne keyPath), kannst du die Fälle nicht unterscheiden. Nutze dann getKey() oder count().
  • Ausnahmen, die sofort (synchron) geworfen werden: DataError bei ungültigem Schlüssel (z. B. null, undefined, NaN, Objekt), TransactionInactiveError, wenn die Transaktion schon beendet ist, InvalidStateError, wenn der Store gelöscht wurde.
  • Transaktions-Lebensdauer: Ein await auf etwas anderes als IndexedDB-Anfragen (z. B. fetch) zwischen zwei Operationen lässt die Transaktion automatisch abschließen. Danach führen weitere get()-Aufrufe zu TransactionInactiveError.
  • Das Ergebnis ist eine Kopie. Änderungen daran werden erst mit put() gespeichert.
  • Kompatibilität: in allen modernen Browsern und in Web Workern verfügbar. Im privaten Modus älterer Safari-/Firefox-Versionen war IndexedDB teilweise eingeschränkt.