Signatur
Beschreibung
Die Eigenschaft lower einer IDBKeyRange-Instanz gibt den Schlüssel zurück, mit dem der Bereich nach unten begrenzt ist. Welche Arten von Schlüsseln es gibt, legt IndexedDB fest: number, string, Date, ArrayBuffer bzw. typisierte Arrays sowie Arrays aus diesen Typen.
Das Ergebnis hängt davon ab, wie der Bereich erzeugt wurde:
IDBKeyRange.bound(lower, upper)undIDBKeyRange.lowerBound(lower):lowerist der übergebene untere Schlüssel.IDBKeyRange.only(value):lowerunduppersind beidevalue.IDBKeyRange.upperBound(upper): Es gibt keine untere Grenze, deshalb istlowergleichundefined.
Ob die Grenze selbst zum Bereich gehört, sagt lower nicht. Das steht in IDBKeyRange.lowerOpen. Beide Eigenschaften braucht man vor allem, wenn man vorhandene Bereiche prüfen, protokollieren oder in neue Bereiche umrechnen will, zum Beispiel beim seitenweisen Laden mit Cursorn.
Rückgabewert
undefined, wenn der Bereich mit IDBKeyRange.upperBound() erzeugt wurde.Beispiele
Untere Grenze verschiedener Bereiche auslesen
const range1 = IDBKeyRange.bound(10, 20, true, false);
const range2 = IDBKeyRange.only('anna');
const range3 = IDBKeyRange.upperBound(100);
console.log(range1.lower, range1.lowerOpen); // 10 true
console.log(range2.lower, range2.upper); // anna anna
console.log(range3.lower); // undefined
Bereich lesbar protokollieren (Debug-Hilfe)
const describeRange = (range) => {
const left = range.lower === undefined
? '(-∞'
: `${range.lowerOpen ? '(' : '['}${JSON.stringify(range.lower)}`;
const right = range.upper === undefined
? '+∞)'
: `${JSON.stringify(range.upper)}${range.upperOpen ? ')' : ']'}`;
return `${left}, ${right}`;
};
console.log(describeRange(IDBKeyRange.bound('A', 'M', false, true)));
console.log(describeRange(IDBKeyRange.lowerBound(2024)));
Seitenweises Laden: nächste Seite ab letztem Schlüssel
const loadPage = (db, range, pageSize = 20) => new Promise((resolve, reject) => {
const store = db.transaction('artikel', 'readonly').objectStore('artikel');
const items = [];
const req = store.openCursor(range);
req.onerror = () => reject(req.error);
req.onsuccess = () => {
const cursor = req.result;
if (!cursor || items.length === pageSize) {
// Die nächste Seite beginnt direkt hinter dem letzten Schlüssel (untere Grenze exklusiv)
const lastKey = items.at(-1)?.id;
const next = lastKey === undefined
? null
: IDBKeyRange.lowerBound(lastKey, true);
resolve({ items, next });
return;
}
items.push(cursor.value);
cursor.continue();
};
});
// Nutzung (db ist eine geöffnete IDBDatabase mit keyPath 'id'):
// const { items, next } = await loadPage(db, IDBKeyRange.lowerBound(0));
// console.log('Nächste Seite ab >', next?.lower);
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung an
range.lowerändert nichts und wirft im Strict Mode einenTypeError. Um andere Grenzen zu bekommen, muss man einen neuen Bereich erzeugen, etwa mitIDBKeyRange.bound(). undefinedheißt „nach unten offen“: Schlüssel können nieundefinedsein. Mitrange.lower === undefinedkann man deshalb sicher prüfen, ob ein Bereich mitupperBound()erzeugt wurde.- Exklusiv oder inklusiv:
lowerliefert nur den Wert. Ob die Grenze selbst im Bereich liegt, zeigtlowerOpen. - Objektschlüssel: Bei
Date- oder Array-Schlüsseln wird der gespeicherte Schlüssel wieder in einen JavaScript-Wert umgewandelt. Man sollte sich nicht auf Objektidentität (===) mit dem ursprünglich übergebenen Objekt verlassen. Zum Vergleichen eignet sichindexedDB.cmp(). - Kompatibilität: Wird von allen modernen Browsern und in Web Workern unterstützt. In Node.js gibt es IndexedDB nicht von Haus aus, dafür braucht man z. B.
fake-indexeddb.