Idb-keyval — это минималистичная обертка над IndexedDB,
обеспечивающая удобное хранение данных в браузере с использованием
ключ-значение. Одним из ключевых аспектов работы с любой базой данных
является обработка сценариев, когда запрашиваемый ключ отсутствует. В
Idb-keyval эта ситуация обрабатывается предсказуемым и
лаконичным образом, что позволяет писать безопасный и устойчивый
код.
Метод get используется для извлечения значения по
ключу:
import { get } from 'idb-keyval';
const value = await get('nonexistentKey');
console.log(value); // null
Ключевой момент: если указанный ключ отсутствует в
хранилище, get возвращает null. Это поведение
отличается от некоторых других API, где может выбрасываться исключение
при отсутствии значения.
Promise.undefined никогда не используется в качестве маркера
отсутствия ключа.Для проверки существования ключа без извлечения значения можно
использовать комбинацию get и проверки на
null:
const exists = (await get('maybeKey')) !== null;
console.log(exists); // true или false
Если необходима только проверка факта существования ключа,
дополнительной функции вроде has в стандартной библиотеке
idb-keyval нет, поэтому рекомендуется использовать именно
такое сравнение.
getnull.delimport { del } from 'idb-keyval';
await del('missingKey');
// Ошибок нет, операция просто игнорируется
del является идемпотентным: повторное удаление
того же ключа не вызывает ошибок и не изменяет состояние хранилища.updateПри обновлении значения с использованием функции, если ключ отсутствует, поведение зависит от того, как реализована функция обновления:
import { update } from 'idb-keyval';
await update('counter', n => (n || 0) + 1);
update передаст
undefined в функцию.|| 0, чтобы
обработать отсутствующее значение и задать начальное число.null или undefined внутри функций обновления,
исключения не выбрасываются.del и
частично update не нарушают консистентность при повторном
вызове.Инициализация данных при первом обращении:
await update('visits', count => (count ?? 0) + 1);
'visits' отсутствует, функция получает
undefined.?? 0 задаёт начальное значение.Удаление условного ключа:
const keyToDelete = 'tempData';
if ((await get(keyToDelete)) !== null) {
await del(keyToDelete);
}
null позволяет безопасно удалить ключ
только при его наличии, хотя вызов del без проверки также
безопасен.Массив данных с инициализацией:
await update('items', arr => (arr ?? []).concat('newItem'));
'items' отсутствует, создается пустой массив, и в
него добавляется элемент.get возвращает null
для отсутствующих ключей.update учитывать возможность передачи
undefined в функцию и корректно задавать начальные
значения.null или безопасной
инициализации данных.Обеспечение устойчивости к отсутствующим ключам делает работу с
idb-keyval простой и предсказуемой. Следование этим
правилам позволяет создавать приложения с безопасной обработкой
хранилища и минимизировать ошибки при работе с IndexedDB.