Skip to main content
Logikfunktionen laufen isoliert in kurzlebigen Node.js-Prozessen – sobald ein Durchlauf abgeschlossen ist, überlebt nichts, was im Speicher gehalten wurde. Wenn Sie sich zwischen Durchläufen etwas merken müssen (eine teure API-Antwort zwischenspeichern, einen Cursor für inkrementelle Synchronisierungen speichern, Arbeit entprellen oder Zustand von einer Funktion an eine andere übergeben), speichern Sie es im integrierten Key-Value-Speicher. Jede Anwendung erhält ihren eigenen isolierten Namespace: Einträge werden durch die authentifizierte App indiziert, sodass Ihre Schlüssel niemals mit denen einer anderen Anwendung kollidieren können – oder von ihr gelesen werden können.

Abrufen, Setzen, Löschen

Importieren Sie kv aus twenty-sdk/logic-function. Werte können beliebige JSON-serialisierbare Werte sein.
src/logic-functions/sync-linear-issues.ts

Geltungsbereiche

Jeder Eintrag hat einen Geltungsbereich, der bei jedem Aufruf als Option übergeben wird. Der Standardwert ist WORKSPACE.
  • WORKSPACE (Standard) – der Eintrag ist nur für die aktuelle Workspace-Installation Ihrer App sichtbar. Jeder Workspace, der die App installiert, erhält seinen eigenen unabhängigen Satz von Schlüsseln. Das ist genau das, was Sie für Caches, Cursor und workspacespezifischen Zustand benötigen.
  • SERVER – der Eintrag wird über alle Installationen Ihrer App auf dem Server hinweg geteilt. Server-Einträge verhalten sich wie Claims: Der gespeicherte Wert ist immer die workspaceId, die den Schlüssel beansprucht hat (lassen Sie value bei set weg, um den Schlüssel für den aktuellen Workspace zu beanspruchen), und nur dieser Workspace kann ihn überschreiben oder löschen. Jede Installation kann den Eintrag lesen.
Server-Claims existieren für Cross-Workspace-Routing. Ein Server-Route-Resolver läuft im Workspace des Anwendungsregistrierungs-Inhabers, aber ein eingehender Webhook übermittelt in der Regel nur eine externe Konto-ID – nicht eine Twenty workspaceId. Lassen Sie jeden Workspace seine externe ID zum Verbindungszeitpunkt beanspruchen und lösen Sie sie dann in der Route auf:
Da ein Server-Schlüssel nur für den eigenen Workspace des Aufrufers beansprucht und niemals von einem anderen überschrieben werden kann, kann ein Workspace kein Mapping kapern, das jemand anderem gehört. kv.set löst eine Exception aus, wenn der Schlüssel bereits von einem anderen Workspace beansprucht wurde.

Verwenden Sie ihn: einen teuren Aufruf zwischenspeichern

Eine typische Verwendung ist das Zwischenspeichern einer langsamen oder ratelimitierten Antwort eines Drittanbieters, sodass wiederholte Durchläufe sie wiederverwenden, anstatt jedes Mal die Kosten zu tragen.
src/logic-functions/getExchangeRate.logic-function.ts

Muster & Tipps

  • Namespacing. Präfixieren Sie Schlüssel, um unterschiedliche Belange getrennt zu halten – sync-cursor:linear, cache:exchange-rate:USD:EUR, lock:nightly-report.
  • Ablauf (TTL). Der Store hat keine eingebaute Ablaufzeit. Speichern Sie einen Zeitstempel im Wert (wie im Cache-Beispiel) und prüfen Sie ihn beim Lesen, oder löschen Sie veraltete Schlüssel aus einer cron-getriggerten Funktion.
  • Was gespeichert wird. Jeder JSON-serialisierbare Wert – Zahlen, Zeichenketten, Arrays, Objekte. Halten Sie Einträge klein; dies ist für Koordination und Caching gedacht, nicht für große Blobs oder Dateien. Für Dateien verwenden Sie ein FILES-Feld und uploadFile.
  • Sichtbarkeit. Einträge liegen in der Instanzdatenbank, nicht als Workspace-Datensätze – sie erscheinen nie in der Workspace-UI, sind kein Teil des Datenmodells Ihrer App und benötigen keine Rollen- oder Objektberechtigungen.

Alternative: ein abfragbares Store-Objekt

Der integrierte Store ist bewusst intransparent: Einträge sind keine Datensätze, daher können Sie sie nicht in der UI durchsuchen, nicht mit anderen Objekten verknüpfen oder mit Record-Abfragen filtern. Wenn Sie irgendetwas davon benötigen – etwa ein sichtbares Sync-Log oder pro-Datensatz-Zustand – definieren Sie stattdessen ein kleines technisches Objekt mit einem eindeutigen key-Feld und einem RAW_JSON-value-Feld und fragen Sie es über den typisierten API-Client ab. Siehe Objekte für die Referenz zu defineObject und Daten → Eindeutige Indizes zur Durchsetzung der Schlüssel-Eindeutigkeit.
  • Geltungsbereich für einen Datensatz. Fügen Sie vom Store-Objekt eine Relation zum Zielobjekt hinzu, anstatt die ID in den Schlüssel zu kodieren.
  • Sichtbarkeit & Berechtigungen. Zeilen befinden sich wie jeder andere Datensatz in der Workspace-Datenbank, sind also über die API abfragbar und respektieren die Rolle Ihrer App. Um den Store aus dem Haupt-UI herauszuhalten, führen Sie ihn nicht in Ihrem Navigationsmenü auf.
Im Gegensatz zum integrierten Store ist ein benutzerdefiniertes Objekt immer auf einen Workspace begrenzt – es kann keine Einträge über Installationen hinweg teilen, so wie es SERVER-Schlüssel tun.