Zum Hauptinhalt springen
Du siehst gerade die Entwicklerdokumentation
Diese Dokumentation richtet sich an Entwickler, die mit der Base44-Entwicklerplattform arbeiten. Informationen zu Backend-Funktionen im App-Editor findest du unter Integrationen verwenden.
Backend-Funktionen ermöglichen es dir, eigenen Backend-Code in einer sicheren, isolierten Umgebung auszuführen. Verwende Funktionen, um Geschäftslogik zu implementieren, die nicht im Browser laufen sollte, dich mit Drittanbieter-APIs mit geschützten Anmeldedaten zu verbinden, Webhooks zu verarbeiten oder deine App mit eigenen Endpunkten zu erweitern. Backend-Funktionen laufen auf Deno, einer modernen TypeScript-Laufzeit. Rufe Funktionen aus deinem Frontend über das SDK auf, das die Authentifizierung automatisch übernimmt. Jede Funktion erhält außerdem ihren eigenen HTTP-Endpunkt für Webhooks und externe Integrationen. Funktionen können auch automatisch über Automationen laufen. Plane Funktionen für bestimmte Zeitpunkte oder löse sie als Reaktion auf Datenbankereignisse aus, etwa beim Erstellen, Aktualisieren oder Löschen von Datensätzen.
Beachte Folgendes:
  • Das Deployen einzelner Funktionen nacheinander ist nicht auf 50 begrenzt. Eine einzelne Anfrage, die alle Funktionen deines Projekts ersetzt, ist weiterhin auf 50 begrenzt.
  • Backend-Funktionen haben eine maximale Ausführungszeit von 5 Minuten, die auf dieselbe Weise durchgesetzt wird – egal ob die Funktion direkt aufgerufen, durch eine Automation ausgelöst oder als Workflow-Schritt aufgerufen wird. Anfragen, die dieses Limit überschreiten, werden abgebrochen.

Funktionen erstellen

Erstelle Backend-Funktionen als TypeScript-Dateien im Funktionsverzeichnis deines Projekts. Standardmäßig ist das Funktionsverzeichnis base44/functions/, aber du kannst den Pfad in deiner Projektkonfiguration anpassen. Jede Funktion lebt in ihrem eigenen Unterverzeichnis mit einer entry.ts- oder entry.js-Datei:
functions
<function-name>
entry.ts
Die CLI verwendet den Verzeichnispfad relativ zum Funktions-Stammverzeichnis als Funktionsnamen. Zum Beispiel erstellt functions/sendWelcomeEmail/entry.ts eine Funktion namens sendWelcomeEmail. Du kannst Funktionen auch zur Organisation in Unterverzeichnissen verschachteln. functions/email/send/entry.ts erstellt eine Funktion namens email/send.

Eine Konfigurationsdatei hinzufügen

Für erweiterte Anforderungen wie eigene Funktionsnamen oder Automationen füge eine function.jsonc-Datei hinzu:
functions
<function-name>
entry.ts
function.jsonc
Die Konfigurationsdatei definiert den Namen der Funktion und ihren Einstiegspunkt:

entry.ts

Die Code-Datei enthält deine Funktionslogik. Funktionen müssen den Deno.serve()-Wrapper verwenden und Response-Objekte zurückgeben:

Mehrere Dateien pro Funktion

Eine Funktion ist nicht auf eine einzelne entry.ts beschränkt. Teile die Logik auf mehrere Dateien im Verzeichnis der Funktion auf und importiere sie mit relativen Pfaden. Jede .js-, .ts-, .json- und .jsonc-Datei im Funktionsverzeichnis wird mit der Funktion deployt.
functions
process-order
entry.ts
validate.ts
types.ts
Relative Importe werden beim Deployen aufgelöst. Ein Import, der auf eine Datei zeigt, die nicht mit der Funktion deployt wird, etwa eine Datei im Verzeichnis einer anderen Funktion, schlägt beim Deployen fehl.

Code zwischen Funktionen teilen

Um Code in mehreren Funktionen wiederzuverwenden, lege ihn in ein shared-Verzeichnis in deinem base44/-Ordner. Wenn du eine Funktion deployst, lädt die CLI das shared-Verzeichnis mit hoch. Der Server bündelt nur die gemeinsamen Dateien, die diese Funktion importiert. Jede Funktion wird mit ihrer eigenen Kopie des gemeinsamen Codes deployt, den sie nutzt. Das bedeutet:
  • Jede Funktion kann mit einem relativen Pfad aus shared importieren.
  • Verschiedene Funktionen können am Ende unterschiedliche Versionen derselben gemeinsamen Datei ausführen. Wenn du eine gemeinsame Datei änderst und nur eine Funktion deployst, wird nur die Kopie dieser Funktion aktualisiert. Die anderen behalten die alte Version, bis du sie erneut deployst. Um eine gemeinsame Änderung überall anzuwenden, führe base44 functions deploy ohne Argumente aus. Damit deployst du alle Funktionen auf einmal neu.
base44
shared
response.ts
functions
greet
entry.ts
farewell
entry.ts
Relative Importe können base44/shared/ erreichen, aber nicht aus base44/ herausführen. Um Code von außerhalb von base44/ zu nutzen, verschiebe ihn nach base44/shared/ oder importiere ihn mit einem npm:- oder jsr:-Specifier.

Lokal testen

Führe deine Funktionen mit base44 dev lokal aus, um Änderungen ohne Deployment zu testen. Details unter Lokale Entwicklung.

Funktionen deployen

Deploye Funktionen mit functions deploy oder deploy, um alle Projektressourcen auf einmal zu pushen. Du kannst bestimmte Funktionen nach Namen mit functions deploy <names...> deployen oder --force verwenden, um Remote-Funktionen zu entfernen, die lokal nicht vorhanden sind. Um deployed Funktionen in dein lokales Projekt herunterzuladen, verwende functions pull. Um zu sehen, was aktuell deployed ist, verwende functions list.

Funktionen aufrufen

Rufe Backend-Funktionen aus deinem Frontend über das SDK auf oder über HTTP für Webhooks und externe Integrationen.

Über das SDK

Verwende base44.functions.invoke(), um Funktionen aus deinem Frontend aufzurufen. Das SDK übernimmt die Authentifizierung automatisch und übergibt die Anmeldedaten des aktuellen Benutzers an deine Funktion.

Über HTTP

Jede deployed Funktion erhält einen HTTP-Endpunkt unter:
Das ist nützlich für:
  • Webhooks: Empfang von Callbacks von externen Diensten wie Stripe oder GitHub.
  • Externe Integrationen: Anderen Systemen die Interaktion mit deiner App ermöglichen.
  • Testen: Funktionen direkt mit Tools wie cURL oder Postman aufrufen.
Beispielverwendung
Beim Aufruf von Funktionen über direktes HTTP (wie cURL oder Webhooks) gibt es keinen authentifizierten Benutzerkontext. Verwende in diesen Fällen asServiceRole für alle Operationen.

Limit für Funktionsketten

Eine Kette von Funktionen, die sich gegenseitig aufrufen, darf bis zu sieben Funktionen lang sein. Die Funktion, die die Kette startet, zählt mit. Jeder Aufruf der achten Funktion an Base44 schlägt mit einem 403-Fehler fehl: error code: 1000. Das gilt auch für Aufrufe an Entitäten und Integrationen. Auch ein erneuter Versuch innerhalb der Kette schlägt auf die gleiche Weise fehl. Eine Funktion wird Teil einer Kette, wenn eine andere Funktion sie mit base44.functions.invoke() oder per fetch() an ihre URL aufruft. So vermeidest du das Limit:
  • Verschiebe Code, den mehrere Funktionen brauchen, nach base44/shared/ und importiere ihn dort. Rufe dann nicht mehr eine Funktion aus einer anderen auf.
  • Teile einen langen Job in einzelne Schritte auf. Lass jeden Schritt seinen Fortschritt speichern und zurückkehren. Starte den nächsten Schritt dann aus deinem Frontend oder über eine geplante Automation, nicht aus dem vorherigen Schritt.

Das SDK in Funktionen verwenden

In deinen Backend-Funktionen kannst du über das Base44-SDK auf die Daten, die Authentifizierung und die Integrationen deiner App zugreifen. Verwende createClientFromRequest(), um einen Client aus dem eingehenden Request zu erstellen. Der Authentifizierungskontext hängt davon ab, wie die Funktion aufgerufen wurde:
  • Beim Aufruf über das SDK aus deinem Frontend: Die Authentifizierung des Benutzers wird automatisch durchgereicht. Du kannst auf den aktuellen Benutzer mit base44.auth.me() zugreifen und Operationen mit seinen Berechtigungen durchführen. Für Operationen auf Admin-Ebene verwende asServiceRole.
  • Beim Aufruf über direktes HTTP (cURL, Webhooks, externe Dienste): Es gibt keinen authentifizierten Benutzer, also verwende asServiceRole für alle Operationen.

Runtime-API

Base44 stellt ein eingebautes Modul base44:runtime mit Plattform-Hilfsfunktionen für deine Funktionen bereit. Importiere es direkt, ohne Installation:
Das Modul exportiert zwei Hilfsfunktionen:
  • waitUntil(): Hält die Funktion am Leben, um Hintergrundarbeit abzuschließen, nachdem du eine Antwort zurückgegeben hast.
  • secrets: Liest die Secrets deiner App zur Laufzeit mit secrets.get().

Hintergrundarbeit nach dem Antworten ausführen

Verwende waitUntil(), um deine Funktion für Hintergrundarbeit am Leben zu halten, nachdem du eine Antwort zurückgegeben hast. Übergib ein Promise, und die Funktion läuft weiter, bis dieses Promise abgeschlossen ist. So kannst du schnell antworten und Arbeiten wie Logging, Benachrichtigungen oder ausgehende Webhooks danach erledigen.
waitUntil() gibt dasselbe Promise zurück, das du übergibst. Du kannst es also später im selben Handler kombinieren oder awaiten.
Hintergrundarbeit erfolgt nach bestem Bemühen. Abschluss und Wiederholung sind nicht garantiert. Verlasse dich daher nicht darauf für kritische Operationen, die nicht verloren gehen dürfen.

Secrets lesen

Verwende secrets.get(), um die Umgebungsvariablen deiner App zur Laufzeit zu lesen. Die Funktion gibt den Wert als String zurück oder undefined, wenn das Secret nicht gesetzt ist:
Rufe secrets.get() innerhalb deines Handlers auf, nicht auf oberster Ebene deines Moduls. Secrets werden pro Request aufgelöst. Ein Lesezugriff beim Laden des Moduls, bevor ein Request läuft, gibt daher undefined zurück. Konfiguriere Secrets über die CLI mit secrets set.

Mit Drittanbieter-APIs verbinden

Backend-Funktionen sind eine von mehreren Möglichkeiten, sich mit Drittanbieter-APIs zu verbinden. Sie sind ideal, wenn du volle Kontrolle über Requests benötigst oder API-Schlüssel sicher als Umgebungsvariablen speichern möchtest. Verwende secrets set, um Umgebungsvariablen über die CLI zu konfigurieren.

Logs ansehen

Während der lokalen Entwicklung wird die Funktionsausgabe direkt in deinem Terminal ausgegeben, ohne den logs-Befehl zu benötigen. Für deployed Funktionen sieh dir die Logs mit dem logs-Befehl an. Die Logs enthalten Konsolenausgaben, Fehler und Zeitinformationen. Du kannst nach Funktionsname oder Zeitraum filtern. Wenn du einen KI-Coding-Agenten verwendest, kann die Skill base44-troubleshooter diese Logs automatisch abrufen und analysieren.

TypeScript-Typen

Generiere TypeScript-Typen aus deinen Funktionskonfigurationen, um Typsicherheit und Autovervollständigung für Funktionsnamen in deinem SDK-Code zu erhalten. Erfahre mehr über dynamische Typen.

Siehe auch

Diese Seite wurde mit KI übersetzt. Die genauesten und aktuellsten Informationen findest du in der englischen Version.