Lesedauer 6 Minuten

PocketBase ist ein komplettes Backend in einer einzigen Datei: Datenbank, Authentifizierung, Datei-Uploads, Realtime und ein Admin-Dashboard. Das Herzstück sind die Collections. In ihnen speicherst Du Deine Daten, definierst Felder und legst fest, wer was lesen und schreiben darf.

In diesem Beitrag zeige ich Dir 10 praxisnahe Code-Beispiele, mit denen Du Collections über das offizielle JavaScript SDK anlegst, abfragst, filterst, änderst und in Echtzeit beobachtest. Die Beispiele lassen sich sehr einfach auf andere Sprachen übertragen.

Was sind Collections in PocketBase?

Eine Collection entspricht grob einer Tabelle in einer relationalen Datenbank. Jeder Eintrag darin heißt Record. PocketBase kennt drei Arten von Collections:

  • Base Collections für ganz normale Daten wie Beiträge, Produkte oder Aufgaben.
  • Auth Collections für Benutzer, inklusive Passwort, E-Mail-Verifizierung und OAuth2.
  • View Collections als schreibgeschützte Sicht auf Daten, definiert über eine SQL-SELECT-Abfrage.
Die drei Collection-Typen in PocketBase

Vorbereitung: Das JavaScript SDK einrichten

Für alle Beispiele brauchst Du eine laufende PocketBase-Instanz (standardmäßig unter http://127.0.0.1:8090) und das SDK. Installiere es mit npm:

Danach erzeugst Du eine Client-Instanz, die Du in allen folgenden Beispielen verwendest:

Die Beispiele beziehen sich auf eine Collection posts mit den Feldern title (Text), content (Editor), published (Bool), author (Relation zu users) und cover (Datei). Sie basieren auf PocketBase ab Version 0.23, in der die Felder einer Collection unter fields definiert werden und Admins als _superusers geführt werden.

Beispiel 1: Eine Collection per Code anlegen

Collections klickst Du normalerweise im Dashboard zusammen. Du kannst sie aber auch per Code erstellen, etwa für Setup-Skripte. Dafür musst Du Dich als Superuser anmelden:

Die Regeln (listRule, createRule usw.) sind das Berechtigungssystem von PocketBase. Ein leerer String bedeutet: jeder darf. null bedeutet: nur Superuser dürfen.

Beispiel 2: Einen Record erstellen

Einen neuen Eintrag legst Du mit create() an. Du übergibst einfach ein Objekt mit den Feldwerten:

PocketBase vergibt automatisch eine 15-stellige id sowie die Zeitstempel created und updated, sofern diese Autodate-Felder in der Collection vorhanden sind.

Beispiel 3: Einen einzelnen Record laden

Kennst Du die ID, holst Du den Eintrag mit getOne():

Suchst Du stattdessen nach einem bestimmten Feldwert, etwa einem Slug, nimmst Du getFirstListItem(). Diese Methode liefert den ersten Treffer und wirft einen 404-Fehler, wenn nichts gefunden wird:

Beispiel 4: Listen mit Paginierung abrufen

Für Listenansichten nutzt Du getList(). Du gibst Seite und Anzahl pro Seite an und bekommst neben den Einträgen auch Infos zur Gesamtmenge:

Brauchst Du wirklich alle Einträge auf einmal, etwa für einen Export, gibt es getFullList(). Das SDK lädt dann intern Seite für Seite nach:

Beispiel 5: Filtern und Sortieren

Die Filtersyntax von PocketBase ist kompakt und mächtig. Du kombinierst Bedingungen mit && und ||, und mit ~ suchst Du nach Teilstrings:

Wichtig: Wenn Werte aus Benutzereingaben stammen, baue den Filter nie per String-Verkettung zusammen. Nutze pb.filter() mit Platzhaltern, dann kümmert sich das SDK um das korrekte Escaping:

Beispiel 6: Relationen mit expand auflösen

Relationsfelder speichern nur die IDs der verknüpften Records. Mit expand lädst Du die kompletten Datensätze in einem einzigen Request mit:

Du kannst auch mehrere Relationen und verschachtelte Ebenen auflösen, zum Beispiel expand: 'author,comments_via_post.user'. Die Schreibweise comments_via_post ist eine sogenannte Back-Relation: Sie holt alle Kommentare, deren Feld post auf diesen Beitrag zeigt. Mit fields begrenzt Du außerdem, welche Felder überhaupt zurückkommen:

Beispiel 7: Einen Record aktualisieren

Mit update() änderst Du einen bestehenden Eintrag. Du musst nur die Felder mitschicken, die sich ändern sollen:

Für Zahlen und Mehrfachfelder gibt es praktische Modifikatoren. views+ erhöht einen Zähler, tags+ hängt einen Wert an, tags- entfernt ihn:

Beispiel 8: Dateien hochladen

Für Datei-Felder übergibst Du ein FormData-Objekt oder direkt ein File/Blob im Datenobjekt. Das SDK wandelt es automatisch in einen Multipart-Request um:

Um eine Datei wieder zu entfernen, setzt Du das Feld auf einen leeren Wert, also cover: null. Bei Mehrfachdateien entfernst Du gezielt eine Datei mit 'cover-': ['dateiname.jpg'].

Beispiel 9: Einen Record löschen

Das Löschen ist der einfachste Teil:

Beachte dabei die Einstellungen Deiner Relationsfelder. Ist bei einer Relation cascadeDelete aktiviert, werden abhängige Records automatisch mitgelöscht. Ist das Feld als Pflichtfeld markiert und die Kaskade deaktiviert, schlägt das Löschen fehl, solange noch Verweise existieren.

Beispiel 10: Realtime-Änderungen abonnieren

Eine der stärksten Funktionen von PocketBase: Du kannst Collections in Echtzeit beobachten. Bei jeder Änderung bekommst Du ein Event mit der Aktion und dem betroffenen Record:

Realtime-Events respektieren die listRule und viewRule Deiner Collection. Ein Benutzer bekommt also nur Events für Records, die er auch lesen dürfte.

Bonus: Mehrere Operationen als Batch ausführen

Seit Version 0.23 kannst Du mehrere Create-, Update- und Delete-Aufrufe in einer einzigen Transaktion bündeln. Schlägt ein Teil fehl, wird alles zurückgerollt. Die Batch API musst Du vorher in den Einstellungen des Dashboards aktivieren:

Der Lebenszyklus eines Records

Die folgende Grafik fasst zusammen, welche SDK-Methode Du für welchen Schritt brauchst:

CRUD-Methoden des PocketBase JavaScript SDK

Tipps für die Praxis

  • Fehler abfangen: Jede SDK-Methode wirft bei Problemen einen ClientResponseError. Über err.status und err.response.data siehst Du genau, welches Feld die Validierung nicht bestanden hat.
  • Auto-Cancellation beachten: Das SDK bricht doppelte, gleichzeitige Requests automatisch ab. Brauchst Du parallele Aufrufe, übergib requestKey: null in den Optionen.
  • Regeln statt Client-Logik: Prüfe Berechtigungen immer über die API-Regeln der Collection und nicht nur im Frontend. Nur dann sind Deine Daten wirklich geschützt.
  • Indizes anlegen: Filterst oder sortierst Du häufig nach einem Feld, lege im Dashboard einen Index dafür an. Das beschleunigt große Collections deutlich.

Alle Methoden und Optionen findest Du ausführlich in der offiziellen PocketBase-Dokumentation und im GitHub-Repository des JavaScript SDK.

Fazit

Mit diesen 10 Code-Beispielen hast Du das komplette Handwerkszeug, um mit PocketBase Collections zu arbeiten: anlegen, Records erstellen, lesen, filtern, Relationen auflösen, aktualisieren, Dateien hochladen, löschen und Änderungen in Echtzeit verfolgen. Das Schöne an PocketBase ist, dass all das mit sehr wenig Code funktioniert. Starte am besten mit einer kleinen Test-Collection, probiere die Beispiele nacheinander aus und baue darauf Dein eigenes Projekt auf.

Häufige Fragen zu PocketBase Collections

Brauche ich für PocketBase Collections SQL-Kenntnisse?

Nein. Base und Auth Collections legst Du komplett über das Dashboard oder das SDK an. SQL brauchst Du nur für View Collections, die auf einer SELECT-Abfrage basieren.

Was ist der Unterschied zwischen getList() und getFullList()?

getList() liefert genau eine Seite mit Paginierungsinfos und eignet sich für Listenansichten. getFullList() lädt alle passenden Records, indem es intern mehrere Seiten abruft. Nutze es nur, wenn Du wirklich alle Daten brauchst.

Wie schütze ich meine Collection vor unbefugtem Zugriff?

Über die API-Regeln der Collection: listRule, viewRule, createRule, updateRule und deleteRule. Mit Ausdrücken wie author = @request.auth.id legst Du fest, dass nur der Besitzer einen Record ändern darf.

Kann ich Collections zwischen Entwicklung und Produktion übertragen?

Ja. Im Dashboard kannst Du unter den Einstellungen alle Collections als JSON exportieren und in einer anderen Instanz importieren. Alternativ nutzt Du die Migrationen von PocketBase, die Änderungen an Collections automatisch als Dateien protokollieren.

Funktionieren die Beispiele auch mit älteren PocketBase-Versionen?

Größtenteils ja, aber nicht vollständig. Vor Version 0.23 hießen die Felddefinitionen schema statt fields, Admins meldeten sich über pb.admins an und die Batch API gab es noch nicht. Ein Update lohnt sich daher.