При работе с localForage ошибки могут возникать на разных уровнях: от проблем инициализации хранилища до ограничений браузера и повреждения данных. Для эффективной диагностики полезно разделять ошибки по источнику возникновения. Такой подход позволяет быстрее определить причину сбоя и выбрать правильную стратегию обработки.
Основные группы ошибок:
Возникают во время создания экземпляра localForage или подготовки драйвера к работе.
Пример создания экземпляра:
const storage = localforage.createInstance({
name: "appStorage"
});
Причины возникновения:
Пример ошибки:
try {
await storage.ready();
} catch (error) {
console.error("Ошибка инициализации:", error);
}
Подобные ошибки обычно возникают до выполнения операций чтения и записи.
localForage поддерживает несколько механизмов хранения данных:
Каждый драйвер имеет собственные ограничения и особенности.
Пример принудительного выбора драйвера:
await localforage.setDriver(localforage.INDEXEDDB);
Ошибка может возникнуть, если драйвер недоступен:
try {
await localforage.setDriver(["customDriver"]);
} catch (error) {
console.error(error);
}
Типичные причины:
Появляются при чтении, записи, удалении или обновлении данных.
Пример записи:
await localforage.setItem("user", {
name: "Alex"
});
Причины возникновения:
Пример обработки:
try {
await localforage.setItem("key", "value");
} catch (error) {
console.error("Ошибка записи:", error);
}
Аналогичные ошибки могут появляться и при чтении:
try {
const data = await localforage.getItem("key");
} catch (error) {
console.error("Ошибка чтения:", error);
}
Каждый браузер ограничивает объём данных, доступных веб-приложению.
При превышении лимита операция записи завершается ошибкой.
Пример:
try {
await localforage.setItem("bigFile", hugeArrayBuffer);
} catch (error) {
console.error(error);
}
Наиболее распространённые причины:
Характерный признак — ошибка типа:
QuotaExceededError
Подобные ошибки особенно актуальны для localStorage, где лимиты значительно меньше, чем у IndexedDB.
Несмотря на то что localForage поддерживает множество типов данных, некоторые объекты невозможно корректно сохранить.
Проблемный пример:
const user = {};
user.self = user;
await localforage.setItem("user", user);
Здесь присутствует циклическая ссылка.
Другие источники ошибок:
Симптомы:
TypeError
DataCloneError
Такие ошибки появляются до фактической записи данных в хранилище.
Возникают при восстановлении данных из внутреннего представления.
Пример:
const value = await localforage.getItem("settings");
Если данные были повреждены либо сохранены нестандартным способом, чтение может завершиться исключением.
Причины:
Подобные ошибки часто обнаруживаются только после обновления приложения.
Браузер может блокировать доступ к механизмам хранения.
Причины:
Пример:
try {
await localforage.ready();
} catch (error) {
console.error(error);
}
В некоторых браузерах приватный режим способен существенно ограничивать работу постоянных хранилищ.
Иногда среда выполнения запрещает доступ к локальному хранилищу.
Подобные ситуации встречаются:
Пример сообщения:
SecurityError
Такой тип ошибок свидетельствует не о проблемах localForage, а об ограничениях платформы.
Различные браузеры реализуют IndexedDB и WebSQL по-разному.
Причины:
Пример проверки поддержки:
const supported = await localforage.supports(
localforage.INDEXEDDB
);
Если механизм недоступен, localForage пытается переключиться на альтернативный драйвер.
localForage позволяет создавать собственные драйверы хранения.
Пример регистрации:
await localforage.defineDriver(customDriver);
Возможные проблемы:
Подобные ошибки обычно сложнее диагностировать, поскольку они находятся за пределами стандартного кода библиотеки.
Наиболее распространённая категория ошибок связана не с localForage, а с бизнес-логикой программы.
Пример:
await localforage.setItem("theme", "dark");
const theme = await localforage.getItem("themes");
Запись выполняется под одним ключом, а чтение — под другим.
Другие варианты:
Такие ошибки редко сопровождаются исключениями и часто приводят к получению значения:
null
Современные веб-приложения могут одновременно использовать localForage из нескольких вкладок.
Сценарий:
// Вкладка №1
await localforage.setItem("counter", 1);
// Вкладка №2
await localforage.setItem("counter", 2);
В результате последнее сохранение перезапишет предыдущее значение.
Проблемы данного класса:
Чем больше параллельных операций выполняется, тем выше вероятность подобных ситуаций.
Поскольку localForage работает через Promise, часть ошибок связана с неправильной обработкой асинхронного кода.
Неправильный пример:
const data = localforage.getItem("user");
console.log(data.name);
Здесь вместо объекта будет Promise.
Правильный вариант:
const data = await localforage.getItem("user");
console.log(data.name);
Типичные проблемы:
Со временем структура сохраняемых объектов меняется.
Старая версия:
{
name: "Alex"
}
Новая версия:
{
firstName: "Alex",
lastName: "Smith"
}
При чтении старых данных приложение может столкнуться с отсутствием ожидаемых полей.
Пример проблемы:
const user = await localforage.getItem("user");
console.log(user.lastName.toUpperCase());
Если поле отсутствует, возникает исключение.
Подобные ошибки особенно часто появляются после обновления приложения.
Хотя современные браузеры обеспечивают высокую надёжность хранения, повреждение данных полностью исключать нельзя.
Причины:
Признаки:
В подобных случаях часто применяется очистка и повторное создание хранилища.
Последняя категория объединяет все исключения, которые невозможно заранее классифицировать.
Пример универсальной обработки:
try {
await localforage.setItem("data", value);
} catch (error) {
console.error(
error.name,
error.message,
error.stack
);
}
К таким ошибкам относятся:
Полноценная стратегия обработки ошибок в localForage обычно строится именно на классификации источников проблем. Разделение ошибок по уровням — инициализация, драйверы, доступ к данным, квоты, безопасность, совместимость, сериализация и логика приложения — позволяет существенно упростить диагностику, повысить надёжность хранения и обеспечить предсказуемую работу клиентского приложения даже в нестабильной среде выполнения.