@exedra/util-nest
v1.0.6
Published
Utilidades para las aplicaciones basadas en NestJS
Downloads
7
Readme
Exedra Util NestJS Library
Utilidades para las aplicaciones basadas en NestJS
Intalación
npm i @exedra/util-nest
Dependencias requeridas
npm i nest-winston @innova2/winston-pg
Instrucciones
Configuración
En el archivo main.ts (usualmente se ubica en la carpeta src) agregue la instancia de logger importada de la librería de exedra
import { WinstonModule } from 'nest-winston';
import { instance } from '@exedra/util-nest/logger/winston.logger';
const app = await NestFactory.create(
AppModule,
{
logger: WinstonModule.createLogger({
instance: instance,
}),
},
);
Luego debe agregar en el módulo principal del servicio (app.module) en la sección de proveedores el filtro de excepciones y el logger de exedra:
import { UtilNestModule } from '@exedra/util-nest';
import { Logger } from '@exedra/util-nest/logger/logger';
import { ExceptionsFilter } from '@exedra/util-nest/filters/exceptions.filter';
@Module({
imports: [
...
UtilNestModule,
],
providers: [
{
provide: APP_FILTER,
useClass: ExceptionsFilter,
},
Logger,
],
})
NOTA: Para usar Sentry como plataforma en la centralización de errores debe instanciar el filtro correspondiente:
import { ExceptionsFilter } from '@exedra/util-nest/filters/ex.sentry.filter';
Logger
La librería provee un middleware a la medida que toma la respuesta del servicio, la procesa, categoriza y almacena en la base de datos del sistema.
Se recomienda utilizar los objetos estandarizados que dispone la librería de exedra para retornar la respuesta del servicio, el uso de estos objetos se explica en la siguiente sección.
Respuesta y manejo de excepciones
Es importante omitir el uso de la estructura try/catch de manera que los mensajes sean gestionados por el middleware de la librería y garantizar una experiencia homogénea para todos los servicios del back-end. A continuación, un ejemplo del manejo de mensajes de respuesta desde el controlador:
Respuesta exitosa
import { ResponseOk } from '@exedra/util-nest/dtos/response';
@Post()
async insert(@Body() params: { id: number, name: string }) {
await this.service.insert(params);
return new ResponseOk();
}
Respuesta exitosa que retorna datos
import { Response } from '@exedra/util-nest/dtos/response';
@Get(':id')
async findOneById(@Param() params: { id: number }) {
const data = await this.service.findOneById(params.id);
return new Response(data);
}
Error
import { Response } from '@exedra/util-nest/dtos/response';
import { ApiException } from '@exedra/util-nest/dtos/exception';
@Get(':id')
async findOneById(@Param() params: { id: number }) {
const data = await this.service.findOneById(params.id);
if (data === null) throw new ApiException(`No se encontró el elemento con identificador ${params.id}`);
return new Response(data);
}
Logger a la medida
Es posible registrar mensajes a la medida en caso de situación especificas en las que requiera almacenar información de auditoria más allá del almacenamiento estándar que provee la librería, para ello, puede inyectar el logger en el componente y usarlo como se muestra más abajo.
Nota: Es importante anotar que cuando usa el logger de esta forma debe definir el valor del contexto que acompañará el mensaje, este debe ser igual al nombre del componente en el que se esté implementando el llamado.
import { Logger } from '@exedra/util-nest/logger/logger';
@Injectable()
export class AppService {
constructor(
private readonly logger: Logger,
) { }
LOG_CONTEXT: string = AppService.name;
method() {
this.logger.info("Este es un mensaje informativo", this.LOG_CONTEXT);
this.logger.warn("Este es un mensaje de advertencia", this.LOG_CONTEXT);
this.logger.error("Este es un mensaje de error", this.LOG_CONTEXT);
}
}