logologo
Empezar
Manual
Desarrollo
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
Empezar
Manual
Desarrollo
Plugins
API
logologo

Inicio rápido

Resumen de desarrollo de plugins
Escribir el primer plugin
Estructura de directorios del proyecto

Desarrollo del lado del servidor

Visión general
Plugin
Colecciones
Operaciones de base de datos
Gestión de fuentes de datos
Gestión de recursos
Control de permisos (ACL)
Middleware
Caché
Evento
Contexto de solicitud
Migración (Script de actualización)
Registro (Logger)
Internacionalización (I18n)
Línea de comandos (Command)
Gestión de tareas programadas
Pruebas

Desarrollo del lado del cliente

Visión general
Plugin
Contexto
Enrutador (Router)
Control de permisos (ACL)
Gestión de fuentes de datos
Recurso
Solicitud
Estilos y temas
Registro (Logger)
Internacionalización (I18n)
Pruebas

Otros

Guía de actualización de plugins
Lista de idiomas
Gestión de dependencias
Compilación
Previous PageGestión de fuentes de datos
Next PageControl de permisos (ACL)
Aviso de traducción por IA

Esta documentación ha sido traducida automáticamente por IA.

#ResourceManager: Gestión de Recursos

La funcionalidad de gestión de recursos de NocoBase puede convertir automáticamente las colecciones (tablas de datos) y asociaciones existentes en recursos. Incluye varios tipos de operaciones para ayudar a los desarrolladores a construir rápidamente operaciones de recursos para APIs REST. A diferencia de las APIs REST tradicionales, las operaciones de recursos de NocoBase no dependen de los métodos de solicitud HTTP, sino que determinan la operación específica a ejecutar mediante la definición explícita de :action.

#Generación automática de recursos

NocoBase convierte automáticamente las colecciones y asociaciones definidas en la base de datos en recursos. Por ejemplo, si define dos colecciones, posts y tags:

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

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

Esto generará automáticamente los siguientes recursos:

  • Recurso posts
  • Recurso tags
  • Recurso de asociación posts.tags

Ejemplos de solicitud:

MétodoRutaOperación
GET/api/posts:listConsultar lista
GET/api/posts:get/1Consultar un solo registro
POST/api/posts:createCrear
POST/api/posts:update/1Actualizar
POST/api/posts:destroy/1Eliminar
MétodoRutaOperación
GET/api/tags:listConsultar lista
GET/api/tags:get/1Consultar un solo registro
POST/api/tags:createCrear
POST/api/tags:update/1Actualizar
POST/api/tags:destroy/1Eliminar
MétodoRutaOperación
GET/api/posts/1/tags:listConsultar todas las tags asociadas a un post
GET/api/posts/1/tags:get/1Consultar una sola tag de un post
POST/api/posts/1/tags:createCrear una sola tag para un post
POST/api/posts/1/tags:update/1Actualizar una sola tag de un post
POST/api/posts/1/tags:destroy/1Eliminar una sola tag de un post
POST/api/posts/1/tags:addAñadir tags asociadas a un post
POST/api/posts/1/tags:removeEliminar tags asociadas de un post
POST/api/posts/1/tags:setEstablecer todas las tags asociadas para un post
POST/api/posts/1/tags:toggleAlternar la asociación de tags para un post
Sugerencia

Las operaciones de recursos de NocoBase no dependen directamente de los métodos de solicitud, sino que determinan las operaciones mediante definiciones explícitas de :action.

#Operaciones de Recursos

NocoBase ofrece una amplia variedad de tipos de operaciones integradas para satisfacer diversas necesidades de negocio.

#Operaciones CRUD Básicas

Nombre de la operaciónDescripciónTipos de recursos aplicablesMétodo de solicitudRuta de ejemplo
listConsultar datos de la listaTodosGET/POST/api/posts:list
getConsultar un solo registro de datosTodosGET/POST/api/posts:get/1
createCrear un nuevo registroTodosPOST/api/posts:create
updateActualizar un registroTodosPOST/api/posts:update/1
destroyEliminar un registroTodosPOST/api/posts:destroy/1
firstOrCreateBuscar el primer registro, crear si no existeTodosPOST/api/users:firstOrCreate
updateOrCreateActualizar un registro, crear si no existeTodosPOST/api/users:updateOrCreate

#Operaciones de Relación

Nombre de la operaciónDescripciónTipos de relación aplicablesRuta de ejemplo
addAñadir asociaciónhasMany, belongsToMany/api/posts/1/tags:add
removeEliminar asociaciónhasOne, hasMany, belongsToMany, belongsTo/api/posts/1/comments:remove
setRestablecer asociaciónhasOne, hasMany, belongsToMany, belongsTo/api/posts/1/comments:set
toggleAñadir o eliminar asociaciónbelongsToMany/api/posts/1/tags:toggle

#Parámetros de Operación

Los parámetros de operación comunes incluyen:

  • filter: Condiciones de consulta
  • values: Valores a establecer
  • fields: Campos a devolver
  • appends: Incluir datos asociados
  • except: Excluir campos
  • sort: Reglas de ordenación
  • page, pageSize: Parámetros de paginación
  • paginate: Si habilitar la paginación
  • tree: Si devolver una estructura de árbol
  • whitelist, blacklist: Lista blanca/negra de campos
  • updateAssociationValues: Si actualizar los valores de asociación

#Operaciones de Recursos Personalizadas

NocoBase permite registrar operaciones adicionales para recursos existentes. Puede usar registerActionHandlers para personalizar operaciones para todos los recursos o para recursos específicos.

#Registrar Operaciones Globales

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

#Registrar Operaciones Específicas de Recursos

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

Ejemplos de solicitud:

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

Regla de nomenclatura: resourceName:actionName. Use la sintaxis de puntos (posts.comments) cuando incluya asociaciones.

#Recursos Personalizados

Si necesita proporcionar recursos que no están relacionados con las colecciones (tablas de datos), puede definirlos utilizando el método resourceManager.define:

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

Los métodos de solicitud son consistentes con los recursos generados automáticamente:

  • GET /api/app:getInfo
  • POST /api/app:getInfo (admite GET/POST por defecto)

#Middleware Personalizado

Utilice el método resourceManager.use() para registrar middleware global. Por ejemplo:

Middleware de registro 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`);
});

#Propiedades Especiales del Contexto

Poder acceder al middleware o a la acción de la capa resourceManager significa que el recurso debe existir.

#ctx.action

  • ctx.action.actionName: Nombre de la operación
  • ctx.action.resourceName: Puede ser una colección o una asociación
  • ctx.action.params: Parámetros de la operación

#ctx.dataSource

El objeto de la fuente de datos actual.

#ctx.getCurrentRepository()

El objeto de repositorio actual.

#Cómo obtener objetos resourceManager para diferentes fuentes de datos

El resourceManager pertenece a una fuente de datos, y las operaciones se pueden registrar por separado para diferentes fuentes de datos.

#Fuente de Datos Principal

Para la fuente de datos principal, puede usar directamente app.resourceManager para operar:

app.resourceManager.registerActionHandlers();

#Otras Fuentes de Datos

Para otras fuentes de datos, puede obtener una instancia específica de fuente de datos a través de dataSourceManager y usar el resourceManager de esa instancia para operar:

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

#Iterar Todas las Fuentes de Datos

Si necesita realizar las mismas operaciones en todas las fuentes de datos añadidas, puede usar el método dataSourceManager.afterAddDataSource para iterar, asegurándose de que el resourceManager de cada fuente de datos pueda registrar las operaciones correspondientes:

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