Aviso de traducción por IA
Esta documentación ha sido traducida automáticamente por IA.
Middleware
El middleware del servidor de NocoBase es esencialmente middleware de Koa. Usted puede operar el objeto ctx para manejar las solicitudes y respuestas, tal como lo haría en Koa. Sin embargo, dado que NocoBase necesita gestionar la lógica en diferentes capas de negocio, si todo el middleware se agrupa, su mantenimiento y gestión se vuelven muy complejos.
Por esta razón, NocoBase divide el middleware en cuatro niveles:
-
Middleware a nivel de fuente de datos: app.dataSourceManager.use()
Solo afecta a las solicitudes de una fuente de datos específica, y se utiliza comúnmente para la lógica de conexión a la base de datos, validación de campos o procesamiento de transacciones de esa fuente de datos.
-
Middleware a nivel de recurso: app.resourceManager.use()
Solo es efectivo para los recursos definidos, y es adecuado para manejar lógica a nivel de recurso, como permisos de datos, formateo, etc.
-
Middleware a nivel de permisos: app.acl.use()
Se ejecuta antes de las comprobaciones de permisos, y se utiliza para verificar los permisos o roles del usuario.
-
Middleware a nivel de aplicación: app.use()
Se ejecuta para cada solicitud, y es adecuado para el registro de logs, el manejo general de errores, el procesamiento de respuestas, etc.
Registro de Middleware
El middleware se registra habitualmente en el método load del plugin, por ejemplo:
export class MyPlugin extends Plugin {
load() {
// Middleware a nivel de aplicación
this.app.use(async (ctx, next) => {
console.log('App middleware');
await next();
});
// Middleware a nivel de fuente de datos
this.app.dataSourceManager.use(async (ctx, next) => {
console.log('DataSource middleware');
await next();
});
// Middleware a nivel de permisos
this.app.acl.use(async (ctx, next) => {
console.log('ACL middleware');
await next();
});
// Middleware a nivel de recurso
this.app.resourceManager.use(async (ctx, next) => {
console.log('Resource middleware');
await next();
});
}
}
Orden de ejecución
El orden de ejecución del middleware es el siguiente:
- Primero se ejecuta el middleware de permisos añadido con
acl.use().
- Luego se ejecuta el middleware de recurso añadido con
resourceManager.use().
- Después se ejecuta el middleware de fuente de datos añadido con
dataSourceManager.use().
- Finalmente se ejecuta el middleware de aplicación añadido con
app.use().
Mecanismo de inserción before / after / tag
Para un control más flexible del orden del middleware, NocoBase proporciona los parámetros before, after y tag:
- tag: Asigna una etiqueta al middleware para que pueda ser referenciado por middleware posterior.
- before: Inserta antes del middleware con la etiqueta especificada.
- after: Inserta después del middleware con la etiqueta especificada.
Ejemplo:
// Middleware regular
app.use(m1, { tag: 'restApi' });
app.resourceManager.use(m2, { tag: 'parseToken' });
app.resourceManager.use(m3, { tag: 'checkRole' });
// m4 se colocará antes de m1
app.use(m4, { before: 'restApi' });
// m5 se insertará entre m2 y m3
app.resourceManager.use(m5, { after: 'parseToken', before: 'checkRole' });
TIP
Si no se especifica una posición, el orden de ejecución predeterminado para el middleware recién añadido es:
acl.use() -> resourceManager.use() -> dataSourceManager.use() -> app.use()
Ejemplo del Modelo de Capas (Cebolla)
El orden de ejecución del middleware sigue el modelo de capas (cebolla) de Koa, lo que significa que primero entra en la pila de middleware y sale al final.
app.use(async (ctx, next) => {
ctx.body = ctx.body || [];
ctx.body.push(1);
await next();
ctx.body.push(2);
});
app.resourceManager.use(async (ctx, next) => {
ctx.body = ctx.body || [];
ctx.body.push(3);
await next();
ctx.body.push(4);
});
app.acl.use(async (ctx, next) => {
ctx.body = ctx.body || [];
ctx.body.push(5);
await next();
ctx.body.push(6);
});
app.resourceManager.define({
name: 'test',
actions: {
async list(ctx, next) {
ctx.body = ctx.body || [];
ctx.body.push(7);
await next();
ctx.body.push(8);
},
},
});
Ejemplos de orden de salida al acceder a diferentes interfaces:
-
Solicitud regular: /api/hello
Salida: [1,2] (recurso no definido, no se ejecuta el middleware de resourceManager y acl)
-
Solicitud de recurso: /api/test:list
Salida: [5,3,7,1,2,8,4,6]
El middleware se ejecuta según el orden de las capas y el modelo de cebolla.
Resumen
- El Middleware de NocoBase es una extensión del Middleware de Koa.
- Cuatro niveles: Aplicación -> Fuente de datos -> Recurso -> Permiso.
- Usted puede usar
before / after / tag para controlar de forma flexible el orden de ejecución.
- Sigue el modelo de capas (cebolla) de Koa, asegurando que el middleware sea componible y anidable.
- El middleware a nivel de fuente de datos solo afecta a las solicitudes de la fuente de datos especificada, y el middleware a nivel de recurso solo afecta a las solicitudes de recursos definidos.