Oi, Felipe, tudo bem?
A sua sugestão é muito boa, mas infelizmente a versão 4 do Express (a utilizada no curso) possui uma limitação quando utilizamos funções assíncronas, que é justamente não serem capazes de capturar erros que são lançados com a palavra-chave throw
. Como os métodos dos controladores são assíncronos, nós somos obrigados a utilizar a função next
, além de tratar os erros de alguma forma que vai acabar sendo repetitiva para cada método, e no curso é feito o uso do try/catch
.
A página Error handling da documentação do Express fala sobre isso, e também algumas formas alternativas de lidar com erros dentro de funções assíncronas, mas acabaria havendo repetição de código independente do método.
Essa mesma página também fala que a versão 5 do Express já lida melhor com o tratamento de erros assíncronos. No momento que escrevo esse post, a versão 5 do Express ainda não foi lançada oficialmente, mas já possui versões experimentais que você pode conferir no Github.
Na versão 5, qualquer erro lançado dentro de um middleware assíncrono automaticamente executa a função next
. Considere o método listarLivros
:
static listarLivros = async (req, res, next) => {
try {
const livrosResultado = await livros.find().populate("autor");
res.status(200).json(livrosResultado);
} catch (erro) {
next(erro);
}
};
Na versão 4 do Express, se você remover o bloco try/catch
e um erro for lançado pelo método find
, o servidor será derrubado. Porém, na versão 5 do Express, esse método poderá ser refatorado para o seguinte:
static listarLivros = async (req, res) => {
const livrosResultado = await livros.find().populate("autor");
res.status(200).json(livrosResultado);
};
Bem melhor, não é? Não haverá mais necessidade de utilizar o try/catch
e nem de chamar o método next
manualmente e, ainda assim, o middleware de erros será chamado automaticamente pelo Express, sem derrubar o servidor. Vamos esperar pelo lançamento oficial dessa versão!
Espero ter ajudado! Abraços e bons estudos :)