Обработка случая, когда ключ не существует

Idb-keyval — это лёгкая обёртка над IndexedDB, упрощающая работу с ключ-значение хранилищем в браузере. Одной из частых задач при работе с этой библиотекой является корректная обработка ситуаций, когда запрашиваемый ключ отсутствует в базе данных. Понимание того, как библиотека возвращает значения и какие механизмы обработки ошибок она предоставляет, критично для построения устойчивых приложений.


Получение значения по ключу

Метод get является основным для извлечения данных:

import { get } from 'idb-keyval';

const value = await get('someKey');
console.log(value);

Если ключ someKey существует, value будет содержать соответствующее значение. Если ключ отсутствует, get возвращает undefined.

Ключевой момент: отсутствие ключа не генерирует ошибку, поэтому обработка через try/catch для этой цели не обязательна. Основная логика заключается в проверке полученного значения:

const value = await get('nonexistentKey');
if (value === undefined) {
    console.log('Ключ не найден в базе данных');
} else {
    console.log('Значение ключа:', value);
}

Присваивание значения по умолчанию

Чтобы избежать повторяющихся проверок undefined при каждом обращении, часто используют значение по умолчанию:

const value = (await get('userSettings')) || { theme: 'light', notifications: true };

В этом примере, если ключ userSettings отсутствует, переменная value получит объект с дефолтными настройками.


Асинхронная обработка отсутствующих ключей

Для более сложной логики, когда требуется выполнить дополнительные операции при отсутствии ключа, удобно использовать условные конструкции с await:

async function loadUserData(userId) {
    const data = await get(`user-${userId}`);
    if (!data) {
        // Создать объект с дефолтными данными и сохранить его
        const defaultData = { name: 'Guest', preferences: {} };
        await set(`user-${userId}`, defaultData);
        return defaultData;
    }
    return data;
}

Таким образом, библиотека позволяет легко комбинировать чтение и инициализацию данных при их отсутствии.


Проверка наличия ключа без извлечения значения

Idb-keyval не предоставляет отдельного метода has, но можно проверить существование ключа через попытку извлечения:

const exists = (await get('someKey')) !== undefined;
console.log('Ключ существует:', exists);

Для сценариев, где важно минимизировать использование памяти при больших данных, иногда создают отдельную таблицу индексов ключей, чтобы не загружать значения полностью.


Обработка ошибок IndexedDB

Хотя отсутствие ключа не вызывает исключений, работа с IndexedDB может генерировать ошибки, например:

  • Недостаток квоты хранилища
  • Блокировка базы данных
  • Проблемы синхронизации при множественных вкладках

Для этих случаев рекомендуется оборачивать операции в try/catch:

try {
    const value = await get('someKey');
    if (value === undefined) {
        console.log('Ключ отсутствует');
    } else {
        console.log('Значение ключа:', value);
    }
} catch (error) {
    console.error('Ошибка при работе с IndexedDB:', error);
}

Практическая рекомендация

Для удобства работы с отсутствующими ключами часто создают обёртки вокруг get, которые автоматически возвращают значение по умолчанию:

async function getWithDefault(key, defaultValue) {
    const value = await get(key);
    return value === undefined ? defaultValue : value;
}

// Использование
const theme = await getWithDefault('theme', 'dark');
console.log(theme);

Такой подход упрощает код и уменьшает вероятность ошибок при обращении к несуществующим ключам.


Особенности типов данных

Idb-keyval корректно сохраняет и извлекает объекты, массивы и примитивные типы. При отсутствии ключа важно учитывать различие между:

  • undefined — ключ отсутствует
  • null — ключ существует и его значение явно задано null
await set('nullableKey', null);
const value = await get('nullableKey');
console.log(value); // null, ключ существует

Таким образом, проверка через value === undefined остаётся надежным способом определения отсутствия ключа.


Idb-keyval предоставляет простую и предсказуемую модель работы с ключ-значение хранилищем. Контроль отсутствующих ключей строится на проверке undefined и использовании значений по умолчанию, что позволяет создавать стабильные и безопасные приложения.