1
resposta

[Sugestão] Qual a forma ideal de lançar um erro no arquivo '.service.ts' ao utilizar o RepositoryPattern

Durante a evolução das aulas as exceções (throw new Error) ficaram nos métodos que foram deixados de ser utilizados nos arquivos .repository.ts. Qual seria forma ideal de lançar um erro dentro dos arquivos .service.ts?

Poderia trazer um exemplo por exemplo, por favor.

1 resposta

No desenvolvimento usando o framework Nest.js com o TypeORM para a persistência de dados em PostgreSQL, a gestão correta de erros é crucial para manter a qualidade e a manutenibilidade do código. Ao trabalhar com o padrão Repository junto com serviços (.service.ts), é recomendável que os serviços lidem com a lógica de negócios e as exceções de maneira eficiente e expressiva.

Práticas Recomendadas para Lançar Erros em .service.ts

  1. Uso de Exceções Específicas: Em vez de lançar um Error genérico, é mais informativo utilizar ou criar classes de erro específicas que possam indicar claramente o tipo do erro. Isso facilita o tratamento de erros e a depuração.

  2. Validação de Entradas: Antes de operações de banco de dados, assegure-se de validar as entradas para evitar dados corrompidos ou operações desnecessárias. Se uma entrada não é válida, lance uma exceção apropriada.

  3. Tratamento de Erros do Repository: Quando um erro ocorre no repositório (por exemplo, falha na conexão com o banco, violação de chave única), capture esses erros no serviço e transforme-os em erros mais específicos, se necessário, antes de relançá-los.

  4. Logs de Erro: Mantenha um registro (log) adequado dos erros para facilitar a análise de problemas.

  5. Customização das Respostas de Erro: Se estiver desenvolvendo uma API REST, considere a possibilidade de customizar as respostas de erro para se alinhar aos padrões RESTful, incluindo o status correto do HTTP e uma mensagem clara.

Exemplo de Código

Aqui está um exemplo de como você poderia implementar o lançamento de uma exceção em um arquivo .service.ts no Nest.js usando TypeORM:

import { Injectable, NotFoundException, InternalServerErrorException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

@Injectable()
export class UserService {
      constructor(
              @InjectRepository(User)
              private userRepository: Repository<User>,
            ) {}
    
      async findUserById(id: number): Promise<User> {
              try {
                        const user = await this.userRepository.findOneBy({ id });
                        if (!user) {
                                    throw new NotFoundException(`User with ID ${id} not found.`);
                        }
                        return user;
              } catch (error) {
                        throw new InternalServerErrorException('Failed to retrieve user.');
              }
      }
}

Neste exemplo, o método findUserById tenta encontrar um usuário pelo ID. Se o usuário não for encontrado, ele lança uma NotFoundException. Se outro tipo de erro ocorrer (como um erro de conexão com o banco), um InternalServerErrorException é lançado. Isso permite que os manipuladores de erro mais acima na cadeia tratem esses erros de forma adequada e enviem respostas apropriadas para o cliente.