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
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.
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.
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.
Logs de Erro: Mantenha um registro (log) adequado dos erros para facilitar a análise de problemas.
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.