1
resposta

[Sugestão] Resolução do middleware de erro

A sintaxe do vídeo não permite que o express-async possa tratar erros de exceções assíncronas, sendo necessário fazer um helper ou deixar as rotas no contexto de async e await

esse foi o helper que fiz, para que o express tratasse as funções e se houvesse um erro lançasse no catch import { NextFunction, Request, Response, RequestHandler } from "express";

export const controllerHandler = ( fn: (req: Request, res: Response, next: NextFunction) => Promise | void ): RequestHandler => { return (req, res, next) => { Promise.resolve(fn(req, res, next)).catch(next); }; };

router.get("/filtro", controllerHandler(petController.buscaPetCampoGenerico));

mas poderia ter sido feita assim também

router.get("filtro", async (req: Request, res: Response) => {await petController.buscaPetCampoGenerico(req, res)}

1 resposta

Olá Bruno! Tudo bem?

Sua abordagem para lidar com erros assíncronos usando o controllerHandler é uma ótima prática! Isso ajuda a garantir que qualquer exceção lançada em funções assíncronas seja capturada e passada para o middleware de erro do Express.

Você mencionou duas maneiras de lidar com funções assíncronas nas rotas:

  1. Usando um helper como controllerHandler:

    import { NextFunction, Request, Response, RequestHandler } from "express";
    
    export const controllerHandler = (
      fn: (req: Request, res: Response, next: NextFunction) => Promise<unknown> | void
    ): RequestHandler => {
      return (req, res, next) => {
        Promise.resolve(fn(req, res, next)).catch(next);
      };
    };
    
    router.get("/filtro", controllerHandler(petController.buscaPetCampoGenerico));
    
  2. Usando async/await diretamente na rota:

    router.get("/filtro", async (req: Request, res: Response) => {
      await petController.buscaPetCampoGenerico(req, res);
    });
    

Ambas as abordagens são válidas, mas a primeira opção com controllerHandler é particularmente útil quando você tem várias rotas assíncronas, pois evita a repetição de try/catch em cada rota e mantém o código mais limpo e organizado.

Além disso, a utilização do pacote express-async-errors é uma solução elegante para permitir que o middleware de erro do Express capture exceções em funções assíncronas automaticamente, sem a necessidade de envolver cada função com try/catch.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!