Операция keys: получение списка ключей

Библиотека idb-keyval представляет собой удобный и лёгкий слой поверх IndexedDB, предоставляющий простые методы для работы с ключами и значениями. Одной из базовых операций является получение всех ключей хранилища с помощью функции keys. Эта операция позволяет получить полный список ключей, что важно для перебора данных, анализа содержимого хранилища и управления кэшированными объектами.


Синтаксис метода keys

import { keys } from 'idb-keyval';

keys(storeName?: IDBObjectStore | undefined): Promise<Array<string>>
  • storeName (необязательный) — объект хранилища IndexedDB, если используется кастомное хранилище вместо стандартного.
  • Возвращает Promise, который разрешается массивом строк — всех ключей, содержащихся в хранилище.

Пример базового использования

import { keys } from 'idb-keyval';

async function listKeys() {
    const allKeys = await keys();
    console.log(allKeys); // ['user1', 'sessionToken', 'settings']
}

listKeys();

В этом примере функция keys возвращает массив всех ключей, сохранённых через стандартное хранилище idb-keyval. Операция является асинхронной и удобна для использования с async/await.


Работа с кастомным хранилищем

Библиотека поддерживает создание собственного хранилища, что позволяет использовать отдельные базы данных и объектные хранилища. Функция keys принимает ссылку на такое хранилище.

import { createStore, keys } from 'idb-keyval';

const customStore = createStore('myDB', 'myStore');

async function listCustomStoreKeys() {
    const storeKeys = await keys(customStore);
    console.log(storeKeys); // ['config', 'theme', 'token']
}

listCustomStoreKeys();

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


Асинхронная природа операции

Метод keys возвращает Promise, так как доступ к IndexedDB выполняется асинхронно. Это предотвращает блокировку основного потока и делает работу с данными плавной. Любые операции, зависящие от списка ключей, должны выполняться внутри блока then или с использованием async/await.

keys().then(allKeys => {
    allKeys.forEach(key => console.log(key));
});

Использование async/await делает код более читабельным и удобным для последовательной обработки данных.


Практические сценарии использования

  1. Перебор всех записей хранилища
import { keys, get } from 'idb-keyval';

async function listAllEntries() {
    const allKeys = await keys();
    for (const key of allKeys) {
        const value = await get(key);
        console.log(key, value);
    }
}

listAllEntries();

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

  1. Удаление всех данных из хранилища
import { keys, del } from 'idb-keyval';

async function clearStore() {
    const allKeys = await keys();
    await Promise.all(allKeys.map(key => del(key)));
}

clearStore();

Использование Promise.all ускоряет удаление, выполняя операции параллельно.

  1. Фильтрация ключей по шаблону
import { keys } from 'idb-keyval';

async function filterKeys(prefix) {
    const allKeys = await keys();
    return allKeys.filter(key => key.startsWith(prefix));
}

filterKeys('user_').then(filtered => console.log(filtered));

Такой подход облегчает управление данными по категориям и пространствам имён.


Особенности и ограничения

  • Метод keys возвращает только ключи, без значений. Для получения значений необходимо использовать метод get.
  • Производительность может снижаться при большом количестве записей, так как IndexedDB выполняет перебор всех ключей.
  • Асинхронная природа требует правильной обработки Promise для исключения ошибок при попытке синхронного использования списка ключей.
  • При работе с кастомными хранилищами важно убедиться, что объект хранилища создан корректно через createStore.

Рекомендации по оптимальному использованию

  • Для больших хранилищ использовать фильтрацию ключей перед обработкой значений, чтобы избежать лишних запросов.
  • Всегда обрабатывать ошибки через try/catch или метод catch у Promise, так как доступ к IndexedDB может завершиться неудачей при недоступной базе данных.
  • Комбинировать с методами get и set для реализации гибких механизмов кэширования и динамического управления данными.

Метод keys является фундаментальной функцией idb-keyval, обеспечивая быстрый доступ к структуре хранилища и позволяя реализовать сложные сценарии перебора, фильтрации и управления данными в IndexedDB.