Node

Microserviço para Autenticação e Gerenciamento de Usuários - REST API

Tratamento de Erros

Try/Catch - Tratamento de Erro com throw


                            async allUsers(): Promise<User[]> {
                                try{
                                    const query = `SELECT uuid, userName FROM users`;
                                    const { rows } = await db.query<User>(query); 
                                    return rows || [];
                                } catch (error) {
                                    console.log('ERRO: ', error);
                                    throw error; 
                                }      
                            }
                        

Try/Catch - Tratamento de Erro com a classe DatabaseError

A classe DatabaseError em src/models/errors/database.error.model.ts irá extender da classe Error

                            class DatabaseError extends Error {
                                constructor(public message: string, public error?: any) {
                                    super(message);
                                }
                            }
                            export default DatabaseError;
                        
Utilização: Necessário importar a classe DatabaseError em src/repositories/user.repository.ts

                            async allUsers(): Promise<User[]> {
                                try{
                                    const query = `SELECT uuid, userName FROM users`;
                                    const { rows } = await db.query<User>(query); 
                                    return rows || [];
                                } catch (error) {
                                    console.log('ERRO: ', error);
                                    throw new DatabaseError('Erro na consulta por ID', error);
                                }      
                            }
                        
Utilização: Necessário importar a classe DatabaseError em src/routes/users.route.ts

                            usersRoute.get('/users', async (req: Request, res: Response, next: NextFunction) => {
                                try{
                                    const users = await userRepository.allUsers();
                                    res.status(StatusCodes.OK).json(users); 
                                }catch(error){
                                    console.log('ERRO: ', error);
                                    if(error instanceof DatabaseError){
                                        res.send(StatusCodes.BAD_REQUEST); 
                                    }else{
                                        res.send(StatusCodes.INTERNAL_SERVER_ERROR); 
                                    } 
                                }
                            });
                        

Error Handling

Middleware

É todo tipo de função que está entre uma requisição HTTP e sua respectiva resposta.
É basicamente um meio de campo, uma forma de gerenciar as coisas, interceptando-as, tratando-as e passando adiante através do método next().
Há dois tipos de middlewares no Express:
Neste caso, de tratamento de erros, é uma forma de centralizar para evitar repetição e complexidade de código.

Criação do Middleware para tratar os erros (Error Handling)

Criar o arquivo src/middlewares/error-handler.ts

                            import { Request, Response, NextFunction } from 'express';
                            import { StatusCodes } from 'http-status-codes';
                            import DatabaseError from "../models/errors/database.error.model";

                            function errorHandler(error: any, req: Request, res: Response, next: NextFunction){

                                if(error instanceof DatabaseError){
                                    res.send(StatusCodes.BAD_REQUEST); 
                                }else{
                                    res.send(StatusCodes.INTERNAL_SERVER_ERROR); 
                                } 
                            }
                            export default errorHandler;
                        

Configurar Error Handling no Server

É necessário refatorar o servidor src/index.ts para configurar Error Handling.

                            import errorHandler from './middlewares/error-handler';

                            app.use(errorHandler);
                        

Refatoras as Rotas para Ligá-las ao Error Handler

As rotas em src/routes/users.route.ts serão refatoradas para que elas chamem o Error Handler.
A ligação será feita através do método next() que será o responsável por chamar o Middleware criado em src/middlewares/error-handler.ts que é o Error Handler que irá tratar os erros. O método next() vai enviar o erro para o Error Handler que estiver registrado no server em src/index.ts

                            usersRoute.get('/users', async (req: Request, res: Response, next: NextFunction) => {
                                try{
                                    const users = await userRepository.allUsers();
                                    res.status(StatusCodes.OK).json(users); 
                                }catch(error){
                                    next(error);
                                }
                            });