logologo
Start
Handbuch
Entwickler
Plugins
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
Start
Handbuch
Entwickler
Plugins
API
logologo

Schnellstart

Plugin-Entwicklung: Überblick
Erstes Plugin schreiben
Projektverzeichnisstruktur

Serverseitige Entwicklung

Überblick
Plugin
Collections (Datentabellen)
Datenbankoperationen
DataSourceManager
ResourceManager
ACL-Zugriffskontrolle
Middleware
Cache
Events
Request-Kontext
Migration (Update-Skripte)
Logger (Protokollierung)
I18n (Internationalisierung)
Command (Befehlszeile)
CronJobManager
Tests

Clientseitige Entwicklung

Überblick
Plugin
Kontext
Router
ACL-Zugriffskontrolle
DataSourceManager
Ressourcen
Requests
Stile & Themes
Logger (Protokollierung)
I18n (Internationalisierung)
Tests

Sonstiges

Plugin-Update-Leitfaden
Sprachenliste
Abhängigkeitsverwaltung
Build
Previous PageDataSourceManager
Next PageACL-Zugriffskontrolle
KI-Übersetzungshinweis

Diese Dokumentation wurde automatisch von KI übersetzt.

#ResourceManager Ressourcenverwaltung

Die Ressourcenverwaltung von NocoBase kann bestehende Datenbanktabellen (Sammlungen) und Verknüpfungen (Associations) automatisch in Ressourcen umwandeln. Sie bietet zudem integrierte Operationstypen, die Entwicklern helfen, REST-API-Ressourcenoperationen schnell zu erstellen. Im Gegensatz zu traditionellen REST-APIs basieren NocoBase-Ressourcenoperationen nicht auf HTTP-Anfragemethoden, sondern definieren die auszuführende Operation explizit über :action.

#Automatische Ressourcengenerierung

NocoBase wandelt in der Datenbank definierte Sammlungen und Associations automatisch in Ressourcen um. Definieren Sie beispielsweise zwei Sammlungen, posts und tags:

db.defineCollection({
  name: 'posts',
  fields: [
    { type: 'belongsToMany', name: 'tags' },
  ],
});

db.defineCollection({
  name: 'tags',
  fields: [],
});

Dadurch werden automatisch die folgenden Ressourcen generiert:

  • posts-Ressource
  • tags-Ressource
  • posts.tags-Associationsressource

Anfragebeispiele:

MethodePfadOperation
GET/api/posts:listListe abfragen
GET/api/posts:get/1Einzelnen Datensatz abfragen
POST/api/posts:createNeu hinzufügen
POST/api/posts:update/1Aktualisieren
POST/api/posts:destroy/1Löschen
MethodePfadOperation
GET/api/tags:listListe abfragen
GET/api/tags:get/1Einzelnen Datensatz abfragen
POST/api/tags:createNeu hinzufügen
POST/api/tags:update/1Aktualisieren
POST/api/tags:destroy/1Löschen
MethodePfadOperation
GET/api/posts/1/tags:listAlle tags abfragen, die mit einem post verknüpft sind
GET/api/posts/1/tags:get/1Einen einzelnen tag unter einem post abfragen
POST/api/posts/1/tags:createEinen einzelnen tag unter einem post erstellen
POST/api/posts/1/tags:update/1Einen einzelnen tag unter einem post aktualisieren
POST/api/posts/1/tags:destroy/1Einen einzelnen tag unter einem post löschen
POST/api/posts/1/tags:addVerknüpfte tags zu einem post hinzufügen
POST/api/posts/1/tags:removeVerknüpfte tags von einem post entfernen
POST/api/posts/1/tags:setAlle verknüpften tags für einen post festlegen
POST/api/posts/1/tags:toggleDie tags-Verknüpfung für einen post umschalten
Hinweis

NocoBase-Ressourcenoperationen hängen nicht direkt von den Anfragemethoden ab, sondern bestimmen die auszuführenden Operationen durch explizite :action-Definitionen.

#Ressourcenoperationen

NocoBase bietet eine Vielzahl integrierter Operationstypen, um unterschiedliche Geschäftsanforderungen zu erfüllen.

#Grundlegende CRUD-Operationen

OperationsnameBeschreibungAnwendbare RessourcentypenAnfragemethodeBeispielpfad
listListendaten abfragenAlleGET/POST/api/posts:list
getEinzelnen Datensatz abfragenAlleGET/POST/api/posts:get/1
createNeuen Datensatz erstellenAllePOST/api/posts:create
updateDatensatz aktualisierenAllePOST/api/posts:update/1
destroyDatensatz löschenAllePOST/api/posts:destroy/1
firstOrCreateErsten Datensatz finden, falls nicht vorhanden, erstellenAllePOST/api/users:firstOrCreate
updateOrCreateDatensatz aktualisieren, falls nicht vorhanden, erstellenAllePOST/api/users:updateOrCreate

#Beziehungsoperationen

OperationsnameBeschreibungAnwendbare BeziehungstypenBeispielpfad
addVerknüpfung hinzufügenhasMany, belongsToMany/api/posts/1/tags:add
removeVerknüpfung entfernenhasOne, hasMany, belongsToMany, belongsTo/api/posts/1/comments:remove
setVerknüpfung zurücksetzenhasOne, hasMany, belongsToMany, belongsTo/api/posts/1/comments:set
toggleVerknüpfung hinzufügen oder entfernenbelongsToMany/api/posts/1/tags:toggle

#Operationsparameter

Häufig verwendete Operationsparameter sind:

  • filter: Abfragebedingungen
  • values: Festzulegende Werte
  • fields: Anzugebende Rückgabefelder
  • appends: Verknüpfte Daten einschließen
  • except: Felder ausschließen
  • sort: Sortierregeln
  • page, pageSize: Paginierungsparameter
  • paginate: Paginierung aktivieren
  • tree: Baumstruktur zurückgeben
  • whitelist, blacklist: Feld-Whitelist/Blacklist
  • updateAssociationValues: Verknüpfungswerte aktualisieren

#Benutzerdefinierte Ressourcenoperationen

NocoBase ermöglicht das Registrieren zusätzlicher Operationen für bestehende Ressourcen. Sie können registerActionHandlers verwenden, um Operationen für alle oder bestimmte Ressourcen anzupassen.

#Globale Operationen registrieren

resourceManager.registerActionHandlers({
  customAction: async (ctx) => {
    ctx.body = { resource: ctx.action.resourceName };
  },
});

#Ressourcenspezifische Operationen registrieren

resourceManager.registerActionHandlers({
  'posts:publish': async (ctx) => publishPost(ctx),
  'posts.comments:pin': async (ctx) => pinComment(ctx),
});

Anfragebeispiele:

POST /api/posts:customAction
POST /api/posts:publish
POST /api/posts/1/comments:pin

Namenskonvention: resourceName:actionName. Bei Verknüpfungen wird die Punktsyntax (posts.comments) verwendet.

#Benutzerdefinierte Ressourcen

Wenn Sie Ressourcen bereitstellen müssen, die nicht mit Datenbanktabellen verknüpft sind, können Sie diese mit der Methode resourceManager.define definieren:

resourceManager.define({
  name: 'app',
  actions: {
    getInfo: async (ctx) => {
      ctx.body = { version: 'v1' };
    },
  },
});

Die Anfragemethoden sind konsistent mit den automatisch generierten Ressourcen:

  • GET /api/app:getInfo
  • POST /api/app:getInfo (unterstützt standardmäßig sowohl GET als auch POST)

#Benutzerdefinierte Middleware

Verwenden Sie die Methode resourceManager.use(), um globale Middleware zu registrieren. Zum Beispiel:

Globale Logging-Middleware

resourceManager.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const duration = Date.now() - start;
  console.log(`${ctx.method} ${ctx.path} - ${duration}ms`);
});

#Spezielle Context-Eigenschaften

Wenn Middleware oder Aktionen die resourceManager-Ebene erreichen können, bedeutet dies, dass die Ressource definitiv existiert.

#ctx.action

  • ctx.action.actionName: Operationsname
  • ctx.action.resourceName: Kann eine Sammlung oder Association sein
  • ctx.action.params: Operationsparameter

#ctx.dataSource

Das aktuelle Datenquellenobjekt.

#ctx.getCurrentRepository()

Das aktuelle Repository-Objekt.

#So erhalten Sie resourceManager-Objekte für verschiedene Datenquellen

resourceManager gehört zu einer Datenquelle; Operationen können für verschiedene Datenquellen separat registriert werden.

#Haupt-Datenquelle

Für die Haupt-Datenquelle können Sie app.resourceManager direkt verwenden, um Operationen auszuführen:

app.resourceManager.registerActionHandlers();

#Andere Datenquellen

Für andere Datenquellen können Sie über dataSourceManager eine spezifische Datenquelleninstanz abrufen und deren resourceManager für Operationen verwenden:

const dataSource = dataSourceManager.get('external');
dataSource.resourceManager.registerActionHandlers();

#Alle Datenquellen durchlaufen

Wenn Sie dieselben Operationen für alle hinzugefügten Datenquellen ausführen möchten, können Sie die Methode dataSourceManager.afterAddDataSource verwenden, um diese zu durchlaufen und sicherzustellen, dass der resourceManager jeder Datenquelle die entsprechenden Operationen registrieren kann:

dataSourceManager.afterAddDataSource((dataSource) => {
  dataSource.resourceManager.registerActionHandlers();
});