Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
No desenvolvimento backend com Node.js, especialmente ao usar o framework Express, uma dúvida recorrente é como obter uma listagem completa das rotas registradas na aplicação. Essa necessidade surge frequentemente em contextos de auditoria, documentação automática, depuração ou até para otimizar a manutenção do código, seja em projetos legados ou em crescimento constante.
Por padrão, o Express armazena as rotas em uma estrutura interna que não é exposta de forma direta ao desenvolvedor. Na versão 3.x, era possível acessar diretamente app.routes, o que facilitava uma inspeção simples. Com a evolução do framework para a versão 4.x, esse método foi depreciado, migrando para a propriedade app._router.stack, que armazena uma pilha de middlewares e rotas. A decisão fica mais saudável quando o time consegue medir o impacto depois.
O problema aqui é que essa pilha inclui componentes de middleware, que nem sempre são rotas propriamente ditas, dificultando a extração de uma lista limpa e útil, especialmente para equipes que precisam de uma visão clara sobre os endpoints disponíveis. Além disso, a estrutura interna pode variar dependendo do uso de routers agrupados, rotas dinâmicas ou middlewares customizados. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Para obter uma listagem confiável, é preciso filtrar cuidadosamente essa pilha. Uma estratégia eficiente é iterar sobre app._router.stack e selecionar apenas os objetos que possuem uma propriedade route, que indica a presença de uma rota registrada.
Um exemplo de pseudocódigo para esse filtro seria:
const rotas = []. app._router.stack.forEach((middleware) => {
if (middleware.route) { // rota padrão
const methods = Object.keys(middleware.route.methods). methods.forEach((method) => {
rotas.push({ method: method.toUpperCase(), path: middleware.route.path }). }). } else if (middleware.name === 'router') { // rotas agrupadas
middleware.handle.stack.forEach((handler) => {
if (handler.route) {
const methods = Object.keys(handler.route.methods). methods.forEach((method) => {
rotas.push({ method: method.toUpperCase(), path: handler.route.path }). }). }
}). }
}). console.log(rotas).
Essa abordagem garante que toda a estrutura de rotas, incluindo routers aninhados, seja capturada de forma estruturada, facilitando a documentação e o controle das endpoints.
Apesar de eficiente, essa inspeção tem seus limites. Em aplicações muito grandes, a passagem por toda a pilha pode impactar a performance, especialmente se feita frequentemente em ambientes de produção. Além disso, rotas dinâmicas ou criadas via programação podem não estar explicitamente visíveis na estrutura, dificultando a captura total. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Outro ponto importante é que essa abordagem exige que o desenvolvedor conheça a estrutura interna do Express e esteja atento às possíveis variações nas versões mais novas ou na maneira como as rotas são registradas. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
A obtenção de uma lista de rotas não é apenas uma tarefa técnica, ela impacta diretamente na manutenção, segurança e na experiência de desenvolvimento de equipes que lidam com APIs complexas. Conhecer essa estrutura e saber manipulá-la com precisão é uma habilidade que agrega valor ao time e ao produto final. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Também acho que vale documentar essas rotas na mão, só pra garantir, mas esse método automatizado ajuda bastante na rotina. manda um ae
Acho que o maior cuidado que dou é com rotas agrupadas usando routers. Essa abordagem explica bem como fazer a extração de forma segura.
Ótima dica, especialmente pra evitar que rotas dinâmicas passem despercebidas. Já tive que fazer algo semelhante em projetos legados.
No meu time, criamos um script que roda na CI pra gerar a documentação automática das rotas, ajuda demais na hora de entender o que tá registrado.