Операция set: запись и перезапись значения

Библиотека Idb-keyval предоставляет упрощённый интерфейс для работы с IndexedDB в браузерах, делая возможным хранение и получение данных с минимальными усилиями. Метод set является ключевым для записи данных в хранилище. Он позволяет сохранять значение по определённому ключу и автоматически обновляет запись, если ключ уже существует.

import { set } from 'idb-keyval';

await set('username', 'alice');

В этом примере создаётся запись с ключом 'username' и значением 'alice'. Если запись с этим ключом уже существовала, её значение будет перезаписано новым.


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

Метод set имеет простую сигнатуру:

set(key: IDBValidKey, value: any): Promise<void>
  • key — уникальный идентификатор записи. Может быть строкой, числом или любым допустимым ключом IndexedDB.
  • value — данные для хранения. Поддерживаются объекты, массивы, строки, числа, булевы значения, а также null или undefined.
  • Метод возвращает Promise<void>, что позволяет использовать async/await для обработки завершения операции.

Перезапись значения

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

await set('username', 'bob');

После выполнения этой операции предыдущая запись 'alice' будет заменена на 'bob'. Важной особенностью является атомарность записи — операция либо полностью завершится, либо не произойдёт вовсе, что исключает риск частично обновлённых данных.


Работа с объектами и сложными структурами

Idb-keyval автоматически сериализует объекты в формат, пригодный для хранения в IndexedDB. Например:

await set('userProfile', { name: 'Alice', age: 25, preferences: { theme: 'dark' } });

При чтении через get будет возвращён полноценный объект:

import { get } from 'idb-keyval';

const profile = await get('userProfile');
console.log(profile.name); // Alice

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


Обработка ошибок при записи

Хотя Idb-keyval значительно упрощает работу с IndexedDB, ошибки всё же возможны. Наиболее частые причины:

  • Превышение лимита хранилища браузера.
  • Попытка использования недопустимого ключа.
  • Ограничения безопасности (например, приватный режим браузера).

Пример обработки ошибки:

try {
    await set('sessionData', { token: 'abc123' });
} catch (err) {
    console.error('Ошибка при записи в IndexedDB:', err);
}

Использование try/catch гарантирует корректное управление ошибками и предотвращает сбой программы при невозможности записи.


Перезапись и атомарные операции

Idb-keyval гарантирует атомарность операции set. Это означает, что:

  1. Если запись нового ключа — операция создаёт новый элемент.
  2. Если ключ уже существует — запись полностью заменяет старое значение.
  3. Любые частичные записи исключены, данные либо полностью записаны, либо операция откатывается.

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


Практические рекомендации по использованию set

  • Для обновления данных лучше использовать set напрямую, вместо ручной проверки существования ключа через get.
  • Хранение сложных объектов не требует дополнительной сериализации.
  • Для больших объёмов данных рекомендуется разделять ключи по логическим группам, чтобы избежать перегрузки отдельного ключа.
  • Всегда оборачивать set в try/catch или использовать .catch() для корректной обработки ошибок асинхронной записи.

Примеры использования в реальных сценариях

Хранение пользовательских настроек:

await set('theme', 'dark');
await set('fontSize', 16);

Кэширование API-ответов:

const data = await fetch('/api/products').then(res => res.json());
await set('productsCache', data);

Сессии и токены авторизации:

await set('authToken', 'xyz-123-token');

В каждом случае set обеспечивает надежную запись данных с возможностью последующей перезаписи без риска потери информации.