В архитектуре localForage драйвер представляет собой механизм хранения данных, через который библиотека взаимодействует с браузерным хранилищем. В зависимости от возможностей среды выполнения localForage может использовать IndexedDB, WebSQL или LocalStorage. Перед началом работы библиотека выполняет процедуру инициализации выбранного драйвера, подготавливая внутренние структуры для чтения и записи данных.
Ошибки инициализации драйвера возникают в момент подготовки выбранного механизма хранения и препятствуют корректной работе экземпляра localForage. Такие ошибки относятся к наиболее важным категориям проблем, поскольку делают невозможным выполнение большинства операций с данными.
После создания экземпляра localForage выполняется последовательность действий:
Упрощённо этот процесс можно представить следующим образом:
const store = localforage.createInstance({
name: "ApplicationDB"
});
await store.ready();
Метод ready() завершится успешно только в случае
корректной инициализации драйвера. При возникновении ошибки будет
сгенерировано исключение.
Наиболее распространённая проблема возникает тогда, когда localForage не может найти ни одного пригодного механизма хранения.
Пример:
await localforage.setDriver([
"unknownDriver"
]);
Результатом станет ошибка, поскольку указанный драйвер не зарегистрирован в системе.
Причины:
Некорректный пример:
await localforage.setDriver("myDriver");
Если драйвер не зарегистрирован через defineDriver(),
инициализация завершится неудачей.
Даже если драйвер существует, браузер может не поддерживать необходимую технологию хранения.
Пример выбора IndexedDB:
await localforage.setDriver(
localforage.INDEXEDDB
);
Если среда выполнения не поддерживает IndexedDB, библиотека не сможет использовать данный драйвер.
Для проверки поддержки применяется метод:
const supported =
await localforage.supports(
localforage.INDEXEDDB
);
Результат:
true
или
false
При значении false попытка принудительно использовать
драйвер может привести к ошибке инициализации.
Иногда разработчик отключает механизм автоматического выбора драйвера и указывает единственный вариант хранения.
Пример:
await localforage.setDriver([
localforage.WEBSQL
]);
Если браузер не поддерживает WebSQL, localForage не сможет переключиться на альтернативный вариант.
В такой ситуации лучше использовать список драйверов:
await localforage.setDriver([
localforage.INDEXEDDB,
localforage.WEBSQL,
localforage.LOCALSTORAGE
]);
Тогда библиотека автоматически выберет первый доступный механизм.
localForage позволяет создавать собственные драйверы.
Пример регистрации:
await localforage.defineDriver(customDriver);
Во время регистрации выполняется проверка структуры объекта драйвера.
Если обязательные методы отсутствуют:
const customDriver = {
_driver: "custom"
};
возникнет ошибка инициализации.
Корректный драйвер должен содержать необходимые методы:
const customDriver = {
_driver: "custom",
_initStorage() {},
clear() {},
getItem() {},
setItem() {},
removeItem() {},
iterate() {},
length() {},
key() {},
keys() {}
};
Метод _initStorage() играет ключевую роль при запуске
драйвера.
Именно здесь обычно происходит:
Пример:
_initStorage() {
throw new Error("Database unavailable");
}
При возникновении исключения драйвер считается неинициализированным.
Использование такого драйвера приведёт к ошибкам:
await store.ready();
или
await store.setItem("key", "value");
Большинство драйверов localForage работают асинхронно.
Например:
_initStorage() {
return Promise.reject(
new Error("Init failed")
);
}
В этом случае ошибка передаётся через механизм Promise.
Обработка выполняется так:
try {
await store.ready();
}
catch(error) {
console.error(error);
}
Игнорирование подобных исключений приводит к труднообнаружимым сбоям при дальнейшей работе с данными.
Для драйвера IndexedDB инициализация включает открытие базы данных через API браузера.
Во время открытия могут возникнуть проблемы:
Условный пример:
indexedDB.open("ApplicationDB");
Если операция открытия завершается ошибкой, localForage не сможет завершить инициализацию.
Типичные сообщения:
UnknownError
VersionError
InvalidStateError
Конкретный текст зависит от браузера и реализации IndexedDB.
При изменении структуры IndexedDB может возникнуть ситуация, когда старая версия базы ещё используется другой вкладкой браузера.
Сценарий:
Результат:
blocked
или аналогичная ошибка открытия базы.
До освобождения старого соединения инициализация нового экземпляра может завершаться неудачей.
Некоторые режимы браузеров ограничивают использование клиентских хранилищ.
Примеры:
Попытка инициализации драйвера может завершиться ошибкой:
SecurityError
Подобные ситуации особенно часто встречаются в нестандартных окружениях.
Хотя LocalStorage считается наиболее простым драйвером, его инициализация также может завершиться ошибкой.
Причины:
Пример сообщения:
QuotaExceededError
или
SecurityError
В подобных случаях даже резервный драйвер LocalStorage оказывается недоступным.
Неправильные параметры конфигурации способны привести к сбоям во время запуска.
Пример:
localforage.config({
name: null
});
или
localforage.config({
storeName: ""
});
Некоторые драйверы чувствительны к подобным значениям и могут отказаться от инициализации.
Особенно это касается IndexedDB и WebSQL, где имена используются при создании внутренних структур хранения.
Метод config() предназначен для настройки до начала
использования localForage.
Некорректный сценарий:
await localforage.setItem("a", 1);
localforage.config({
name: "NewDB"
});
После начала работы изменение конфигурации уже не влияет на активный экземпляр.
Это может приводить к непредсказуемому поведению и ошибкам инициализации последующих экземпляров.
Иногда пользовательский драйвер регистрируется слишком поздно.
Некорректный порядок:
localforage.setDriver("custom");
localforage.defineDriver(customDriver);
На момент выбора драйвер ещё отсутствует в системе.
Правильная последовательность:
await localforage.defineDriver(
customDriver
);
await localforage.setDriver(
"custom"
);
Многие операции автоматически ожидают завершения инициализации,
однако при сложной архитектуре приложения рекомендуется явно
использовать ready().
Проблемный код:
store.setItem("user", data);
Если инициализация завершится ошибкой, исключение может проявиться не сразу.
Более надёжный вариант:
await store.ready();
await store.setItem(
"user",
data
);
Так ошибка будет обнаружена непосредственно на этапе запуска хранилища.
Для анализа проблем полезно фиксировать информацию о драйвере.
Получение имени активного драйвера:
console.log(
store.driver()
);
Проверка готовности:
try {
await store.ready();
console.log("Ready");
}
catch(error) {
console.error(error);
}
Проверка поддержки:
console.log(
await localforage.supports(
localforage.INDEXEDDB
)
);
Подобная диагностика позволяет определить:
Наиболее устойчивым считается подход с централизованной обработкой:
async function initializeStorage() {
try {
await localforage.ready();
return true;
}
catch(error) {
console.error(
"Storage initialization failed:",
error
);
return false;
}
}
Преимущества такого подхода:
Ошибки инициализации драйвера относятся к фундаментальным сбоям
инфраструктуры localForage. Они возникают до начала полноценной работы с
данными и обычно связаны с неподдерживаемым драйвером, ошибками
регистрации, проблемами браузерных API, ограничениями безопасности либо
некорректной конфигурацией экземпляра. Грамотная проверка поддержки
драйверов, использование резервных вариантов хранения и обязательный
контроль выполнения ready() существенно повышают надёжность
приложений, использующих localForage.