Los interceptores se ejecutan antes de la ejecución del manejador de ruta. Pueden inspeccionar la solicitud, cortocircuitar la ejecución o agregar efectos secundarios como el registro de logs.
Interfaz Interceptor
nestelia provee una interfaz de interceptor simple:
interface Interceptor {
intercept(context: any): Promise<boolean | void> | boolean | void;
}El argumento context es el contexto nativo de Elysia (el mismo que @Ctx()).
Devolver false evita que el manejador de ruta se ejecute.
Crear un Interceptor
Interceptor de Autenticación
import { Injectable } from "nestelia";
@Injectable()
class AuthInterceptor implements Interceptor {
intercept(ctx: any): boolean {
const token = ctx.request.headers.get("authorization");
if (!token) {
ctx.set.status = 401;
return false; // bloquea el manejador
}
return true; // permite que el manejador continúe
}
}Interceptor de Logging
@Injectable()
class LoggingInterceptor implements Interceptor {
intercept(ctx: any): void {
const start = Date.now();
console.log(`→ ${ctx.request.method} ${ctx.request.url}`);
// Después de esto, el manejador se ejecuta
// Nota: la lógica post-manejador requiere ResponseInterceptor
}
}Usar Interceptores
Aplica interceptores con @UseInterceptors() a nivel de controlador o de método:
import { UseInterceptors } from "nestelia";
@Controller("/users")
@UseInterceptors(LoggingInterceptor)
class UserController {
@Get("/")
findAll() {
return this.userService.findAll();
}
@Get("/secure")
@UseInterceptors(AuthInterceptor)
secure() {
return { secret: "data" };
}
}ResponseInterceptor
Para agregar lógica que se ejecute después del manejador, implementa ResponseInterceptor:
interface ResponseInterceptor {
interceptAfter(context: any): Promise<any> | any;
}@Injectable()
class TimingInterceptor implements ResponseInterceptor {
interceptAfter(ctx: any) {
ctx.set.headers["x-response-time"] = String(Date.now());
}
}Interfaz NestInterceptor
La interfaz NestInterceptor está exportada pero no se ejecuta automáticamente por el manejador de ruta. Usa Interceptor o ResponseInterceptor para el comportamiento real:
// Disponible para importar pero no se invoca automáticamente
export interface NestInterceptor<T = any, R = any> {
intercept(context: ExecutionContext, next: CallHandler<T>): Observable<R> | Promise<Observable<R>>;
}Múltiples Interceptores
Cuando se aplican múltiples interceptores, se ejecutan en el orden indicado. Si algún interceptor devuelve false, los interceptores siguientes y el manejador de ruta son omitidos:
@Get("/admin")
@UseInterceptors(AuthInterceptor, LoggingInterceptor)
adminRoute() { /* ... */ }