logologo
Démarrer
Manuel
Développement
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
Démarrer
Manuel
Développement
Plugins
API
logologo

Démarrage rapide

Aperçu du développement de plugins
Créer son premier plugin
Structure des répertoires du projet

Développement côté serveur

Aperçu
Plugin
Collections (Tables de données)
Database (Opérations)
DataSourceManager (Gestion des sources de données)
ResourceManager (Gestion des ressources)
ACL (Contrôle des permissions)
Middleware
Cache
Event (Événement)
Context (Contexte de la requête)
Migration (Script de mise à niveau)
Logger (Journal)
I18n (Internationalisation)
Command (Ligne de commande)
CronJobManager (Gestion des tâches planifiées)
Test

Développement côté client

Aperçu
Plugin
Context (Contexte)
Router (Routeur)
ACL (Contrôle des permissions)
DataSourceManager (Gestion des sources de données)
Resource (Ressource)
Request (Requête)
Styles & Themes
Logger (Journal)
I18n (Internationalisation)
Test

Autres

Guide de mise à niveau des plugins
Liste des langues
Gestion des dépendances
Build
Previous PageDataSourceManager (Gestion des sources de données)
Next PageACL (Contrôle des permissions)
Avis de traduction IA

Cette documentation a été traduite automatiquement par IA.

#ResourceManager

La fonctionnalité de gestion des ressources de NocoBase peut convertir automatiquement les collections et les associations existantes en ressources. Elle intègre également plusieurs types d'opérations pour vous aider à construire rapidement des opérations de ressources pour les API REST. Contrairement aux API REST traditionnelles, les opérations de ressources de NocoBase ne dépendent pas des méthodes de requête HTTP, mais déterminent l'opération spécifique à exécuter via des définitions explicites de :action.

#Génération automatique de ressources

NocoBase convertit automatiquement les collection et les association définies dans la base de données en ressources. Par exemple, si vous définissez deux collections, posts et tags :

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

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

Ceci générera automatiquement les ressources suivantes :

  • ressource posts
  • ressource tags
  • ressource d'association posts.tags

Exemples de requêtes :

MéthodeCheminOpération
GET/api/posts:listLister
GET/api/posts:get/1Obtenir un élément
POST/api/posts:createCréer
POST/api/posts:update/1Mettre à jour
POST/api/posts:destroy/1Supprimer
MéthodeCheminOpération
GET/api/tags:listLister
GET/api/tags:get/1Obtenir un élément
POST/api/tags:createCréer
POST/api/tags:update/1Mettre à jour
POST/api/tags:destroy/1Supprimer
MéthodeCheminOpération
GET/api/posts/1/tags:listInterroger tous les tags associés à un post
GET/api/posts/1/tags:get/1Interroger un seul tag sous un post
POST/api/posts/1/tags:createCréer un seul tag sous un post
POST/api/posts/1/tags:update/1Mettre à jour un seul tag sous un post
POST/api/posts/1/tags:destroy/1Supprimer un seul tag sous un post
POST/api/posts/1/tags:addAjouter des tags associés à un post
POST/api/posts/1/tags:removeSupprimer des tags associés d'un post
POST/api/posts/1/tags:setDéfinir tous les tags associés pour un post
POST/api/posts/1/tags:toggleBasculer l'association des tags pour un post
Astuce

Les opérations de ressources NocoBase ne dépendent pas directement des méthodes de requête, mais déterminent les opérations via des définitions explicites de :action.

#Opérations sur les ressources

NocoBase propose de nombreux types d'opérations intégrées pour répondre à divers besoins métier.

#Opérations CRUD de base

Nom de l'opérationDescriptionTypes de ressources applicablesMéthode de requêteExemple de chemin
listInterroge les données d'une listeToutesGET/POST/api/posts:list
getInterroge un seul enregistrementToutesGET/POST/api/posts:get/1
createCrée un nouvel enregistrementToutesPOST/api/posts:create
updateMet à jour un enregistrementToutesPOST/api/posts:update/1
destroySupprime un enregistrementToutesPOST/api/posts:destroy/1
firstOrCreateTrouve le premier enregistrement, le crée s'il n'existe pasToutesPOST/api/users:firstOrCreate
updateOrCreateMet à jour un enregistrement, le crée s'il n'existe pasToutesPOST/api/users:updateOrCreate

#Opérations de relation

Nom de l'opérationDescriptionTypes de relations applicablesExemple de chemin
addAjoute une associationhasMany, belongsToMany/api/posts/1/tags:add
removeSupprime une associationhasOne, hasMany, belongsToMany, belongsTo/api/posts/1/comments:remove
setRéinitialise une associationhasOne, hasMany, belongsToMany, belongsTo/api/posts/1/comments:set
toggleAjoute ou supprime une associationbelongsToMany/api/posts/1/tags:toggle

#Paramètres d'opération

Les paramètres d'opération courants incluent :

  • filter : Conditions de requête
  • values : Valeurs à définir
  • fields : Spécifie les champs à retourner
  • appends : Inclut les données associées
  • except : Exclut les champs
  • sort : Règles de tri
  • page, pageSize : Paramètres de pagination
  • paginate : Indique si la pagination est activée
  • tree : Indique si une structure arborescente doit être retournée
  • whitelist, blacklist : Liste blanche/noire de champs
  • updateAssociationValues : Indique si les valeurs d'association doivent être mises à jour

#Opérations de ressources personnalisées

NocoBase permet d'enregistrer des opérations supplémentaires pour les ressources existantes. Vous pouvez utiliser registerActionHandlers pour personnaliser les opérations pour toutes les ressources ou pour des ressources spécifiques.

#Enregistrer des opérations globales

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

#Enregistrer des opérations spécifiques à une ressource

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

Exemples de requêtes :

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

Règle de nommage : resourceName:actionName. Utilisez la syntaxe à points (posts.comments) lorsque vous incluez des associations.

#Ressources personnalisées

Si vous avez besoin de fournir des ressources qui ne sont pas liées à des collections, vous pouvez les définir en utilisant la méthode resourceManager.define :

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

Les méthodes de requête sont cohérentes avec les ressources générées automatiquement :

  • GET /api/app:getInfo
  • POST /api/app:getInfo (prend en charge GET/POST par défaut)

#Middleware personnalisé

Utilisez la méthode resourceManager.use() pour enregistrer un middleware global. Par exemple :

Middleware de journalisation global

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

#Propriétés de contexte spéciales

Le fait de pouvoir accéder au middleware ou à l'action de la couche resourceManager signifie que la ressource existe nécessairement.

#ctx.action

  • ctx.action.actionName : Nom de l'opération
  • ctx.action.resourceName : Peut être une collection ou une association
  • ctx.action.params : Paramètres de l'opération

#ctx.dataSource

L'objet source de données actuel.

#ctx.getCurrentRepository()

L'objet repository actuel.

#Comment obtenir les objets resourceManager pour différentes sources de données

Le resourceManager appartient à une source de données, et vous pouvez enregistrer des opérations séparément pour différentes sources de données.

#Source de données principale

Pour la source de données principale, vous pouvez utiliser directement app.resourceManager :

app.resourceManager.registerActionHandlers();

#Autres sources de données

Pour les autres sources de données, vous pouvez obtenir une instance de source de données spécifique via dataSourceManager et utiliser le resourceManager de cette instance :

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

#Parcourir toutes les sources de données

Si vous devez effectuer les mêmes opérations sur toutes les sources de données ajoutées, vous pouvez utiliser la méthode dataSourceManager.afterAddDataSource pour itérer, en vous assurant que le resourceManager de chaque source de données peut enregistrer les opérations correspondantes :

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