Idb-keyval — это легковесная обертка над IndexedDB, которая упрощает работу с асинхронным хранением ключ–значение. Она предоставляет простой API для операций get, set, del и clear, позволяя хранить данные в браузере без необходимости разрабатывать сложную логику для работы с транзакциями и объектными хранилищами.
Пример базового использования:
import { get, set, del, clear } from 'idb-keyval';
await set('user', { name: 'Alice', age: 25 });
const user = await get('user');
await del('user');
await clear();
Работа с IndexedDB через Idb-keyval подразумевает работу с асинхронными операциями, каждая из которых потенциально может завершиться ошибкой. Ошибки в IndexedDB имеют специфическую структуру и причины возникновения, которые можно классифицировать для упрощения обработки и отладки.
Происходят на этапе инициализации соединения с IndexedDB. Основные причины:
Пример обработки ошибки открытия:
import { set } from 'idb-keyval';
try {
await set('key', 'value');
} catch (err) {
console.error('Ошибка открытия базы данных:', err);
}
Все операции в IndexedDB выполняются через транзакции. Транзакция может быть прервана или не завершиться успешно. Типичные причины:
Характерная особенность: если транзакция не завершилась, все изменения откатываются автоматически.
import { set } from 'idb-keyval';
try {
await set('user', { name: 'Bob' });
} catch (err) {
console.error('Ошибка транзакции:', err);
}
IndexedDB строго проверяет типы данных, которые можно хранить:
import { set } from 'idb-keyval';
try {
const circular = {};
circular.self = circular;
await set('circular', circular);
} catch (err) {
console.error('Ошибка данных:', err);
}
Возникают, когда скрипт не имеет разрешения на запись или чтение из IndexedDB:
import { get } from 'idb-keyval';
try {
const data = await get('key');
} catch (err) {
console.error('Ошибка доступа:', err);
}
Операции del и clear также могут
завершаться ошибкой, чаще всего из-за:
import { del, clear } from 'idb-keyval';
try {
await del('key');
await clear();
} catch (err) {
console.error('Ошибка удаления/очистки:', err);
}
Оборачивать каждую асинхронную операцию в
try/catch Это гарантирует, что любая ошибка будет
корректно поймана, а приложение не упадет.
Использовать логирование с деталями ошибки
IndexedDB возвращает объекты ошибок с полями name и
message, которые помогают классифицировать
проблему.
Разделять ошибки по типу операции Это облегчает отладку: ошибки транзакции, ошибок данных и ошибок доступа требуют разных способов решения.
Проверять доступность IndexedDB перед выполнением операций:
if (!('indexedDB' in window)) {
console.error('IndexedDB не поддерживается в этом браузере');
}
Idb-keyval упрощает работу с IndexedDB, но не скрывает полностью природу ошибок. Важно учитывать, что:
await или .then/.catch.name и message.Эффективная обработка ошибок позволяет строить устойчивые веб-приложения, которые сохраняют данные пользователя и корректно реагируют на ограничения среды исполнения.