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();
});