Tratamento de erros

Filtro global ErrorsFilter para Zod, TypeORM e erros internos.

O ErrorsFilter é registrado globalmente em main.ts e padroniza respostas de erro para validação Zod, erros TypeORM e falhas internas.

typescript
const { httpAdapter } = app.get(HttpAdapterHost);
const loggingService = app.get(ILoggingService);

app.useGlobalFilters(new ErrorsFilter(httpAdapter, loggingService));
typescript
@Catch()
export class ErrorsFilter extends BaseExceptionFilter {
  constructor(
    httpAdapter: AbstractHttpAdapter | undefined,
    private readonly loggingService: ILoggingService,
  ) {
    super(httpAdapter);
  }

  async catch(exception: unknown, host: ArgumentsHost) {
    if (exception instanceof ZodError) {
      return this.sendErrorResponse(host, this.handleZodError(exception));
    }

    if (exception instanceof Error && isTypeOrmError(exception)) {
      return this.sendErrorResponse(host, this.handleTypeOrmError(exception));
    }

    if (exception instanceof HttpException) {
      return super.catch(exception, host);
    }

    const error =
      exception instanceof Error ? exception : new Error(String(exception));

    await this.reportError(error, host);

    return this.sendErrorResponse(host, {
      statusCode: HttpStatus.INTERNAL_SERVER_ERROR,
      message: 'Erro interno do servidor.',
    });
  }
}

Quando um validator lança ZodError, a resposta é HTTP 400 com detalhes por campo:

typescript
private handleZodError(exception: ZodError): ErrorResponse {
  const formatted = formatZodError(exception);

  return {
    statusCode: HttpStatus.BAD_REQUEST,
    message: formatted.message,
    errors: formatted.errors,
  };
}

Exemplo de resposta (campo name ausente em create):

json
{
  "statusCode": 400,
  "message": "O campo name é obrigatório.",
  "errors": [
    { "field": "name", "message": "O campo name é obrigatório." }
  ]
}

Violações de constraint (unique, foreign key, etc.) são formatadas com status e mensagem amigável via formatTypeOrmError().

NotFoundException, BadRequestException e demais HttpException seguem o comportamento padrão do NestJS:

typescript
if (!person) {
  throw new NotFoundException('Pessoa não encontrada');
}

Qualquer erro desconhecido retorna HTTP 500 com mensagem genérica. O erro é reportado via ILoggingService.report() (usuário da request + nome do pacote). Se o report falhar, o filtro usa Logger como fallback — sem expor detalhes ao cliente.

typescript
interface ErrorResponse {
  statusCode: HttpStatus;
  message: string;
  errors?: ZodFieldError[];
}

Koala Nest

Facilitador para criar APIs NestJS com arquitetura DDD. Código copiado para o seu repositório — legível, adaptável e sob seu controle.

Creator

igordrangel.com.br

Design, back-end e estratégia de produto.

Comandos rápidos

CLI global e scripts no projeto gerado

  • bun install -g @koalarx/nest
  • kl-nest new
  • kl-nest add cache
  • bun run migration:run # template CRUD
  • kl-nest --help
© 2026 Koala NestFeito para desenvolvedores NestJS e fluxos assistidos por IA.