Перейти к основному содержанию
Логические функции выполняются в изолированной среде во временных процессах Node.js — после завершения запуска в памяти ничего не сохраняется. Когда вам нужно что-то запомнить между запусками (кэшировать дорогой ответ API, сохранить курсор для инкрементальной синхронизации, «задебаунсить» работу или передать состояние от одной функции к другой), сохраняйте это в базе данных рабочего пространства. Для этого не нужен отдельный примитив хранилища: небольшой технический объект с полем key и полем value даёт вам надёжное key-value-хранилище, ограниченное рабочим пространством и доступное для запросов через тот же типизированный API-клиент, который вы уже используете для записей.

Определите объект хранилища

Объявите настраиваемый объект с двумя полями — key (уникальный TEXT) и value (RAW_JSON, чтобы можно было сохранять любые JSON-сериализуемые данные). См. Objects для полной справки по defineObject.
src/objects/kv-store.object.ts

Обеспечьте уникальность ключей

Добавьте уникальный индекс на key, чтобы один и тот же ключ никогда не мог иметь две строки. Это рекомендуемый примитив для обеспечения уникальности — см. Data → Unique indexes.
src/indexes/kv-store-key.index.ts

Чтение и запись из логической функции

Спрячьте объект за несколькими небольшими вспомогательными функциями, чтобы остальной код выглядел как key-value API — get, set и del. Они используют CoreApiClient, который генерируется из схемы вашего рабочего пространства и полностью типизирован относительно объекта kvStore.
src/logic-functions/handlers/kv-store.ts
Уникальный индекс защищает от дубликатов, но два запуска, записывающие один и тот же новый ключ в один и тот же момент, всё ещё могут войти в гонку между поиском и созданием. Рассматривайте создание, которое завершилось сбоем по ограничению уникальности, как «кто-то другой успел первым» — перехватите его и перечитайте, или повторите попытку как обновление.

Использование: кэширование дорогого вызова

Типичный сценарий — кэширование медленного или ограниченного по частоте ответа стороннего сервиса, чтобы при повторных запусках переиспользовать его, а не нести затраты каждый раз.
src/logic-functions/getExchangeRate.logic-function.ts

Шаблоны и советы

  • Пространства имён. Добавляйте префиксы к ключам, чтобы разделять разные задачи и упростить массовые выборки — sync-cursor:linear, cache:exchange-rate:USD:EUR, lock:nightly-report. Фильтруйте по key: { like: 'cache:%' }, чтобы перечислить или очистить целое пространство имён.
  • Срок жизни (TTL). У хранилища нет встроенного механизма истечения срока действия. Сохраняйте метку времени внутри value (как в примере с кэшем) и проверяйте её при чтении, или добавьте поле DATE_TIME и периодически очищайте устаревшие строки из функции, запускаемой по cron.
  • Что хранить. RAW_JSON может содержать любое JSON-сериализуемое значение — числа, строки, массивы, объекты. Держите записи небольшими; это для координации и кэширования, а не для больших блобов или файлов. Для файлов используйте поле FILES и uploadFile.
  • Видимость и разрешения. Строки живут в базе данных рабочего пространства как любые другие записи, поэтому к ним можно обращаться через API, и они подчиняются ролям вашего приложения. Чтобы скрыть хранилище из основного пользовательского интерфейса, не добавляйте его в навигационное меню.
  • Привязка к записи. Нужно состояние на уровне отдельной записи вместо глобальных ключей? Добавьте relation из объекта хранилища к целевому объекту вместо кодирования идентификатора в ключе.
Это соглашение, а не отдельная функция — «KV Store» — это просто обычный настраиваемый объект, который вы определяете и к которому обращаетесь с помощью стандартного API. Это значит, что он получает преимущества той же синхронизации, системы разрешений и инструментов, что и остальные данные вашего приложения.