1001Ferramentas
🛣️ Dev

Testador de Padrão de Rota (Express)

Testa uma URL contra padrões de rota estilo Express (/users/:id), mostra qual casa primeiro, os parâmetros extraídos e conflitos entre rotas.

Aceita :param, :param?, :param(\d+) e * no fim para o resto do caminho. A query string é separada e não participa do match.

Como o router escolhe a rota

O Express percorre a pilha na ordem de registro e para no primeiro padrão cuja regex casa com o pathname. Um /users/:id genérico declarado antes de /users/me engole a rota literal, e nenhum erro aparece — o segundo handler simplesmente nunca roda. Por isso o bloco de ordem marca os padrões sombreados.

Parâmetros sempre capturam um único segmento, então :id nunca atravessa uma barra — /files/a/b precisa de um curinga no fim. Os valores chegam percent-encoded e o Express decodifica, por isso café aparece como caf%C3%A9 na coluna do valor cru. Tudo aqui roda no seu navegador; nenhum padrão ou URL é enviado para lugar nenhum.

Por que sua rota Express não está batendo

Cole os padrões na mesma ordem em que eles aparecem no seu arquivo de rotas e o teste responde à pergunta que interessa: qual handler o Express chamaria para esta URL. Um app com /users/:id registrado na linha 12 e /users/me na linha 30 nunca chega na segunda rota, porque o parâmetro engole a palavra me e o id acaba valendo a string me dentro do handler. O bloco de ordem marca essa sombra linha por linha.

Cada padrão vira uma regex ancorada, montada segmento a segmento. O :id captura um único trecho entre barras, então /files/a/b só casa com um curinga no fim; o :cid? deixa o segmento inteiro opcional, e não apenas o valor; e o :id(\d+) troca o grupo genérico pela regex que você escreveu. Colando a URL completa, a query fica fora do match e aparece separada, que é o que o router faz de verdade.

O detalhe que costuma atrapalhar o debug é o encoding. O valor chega percent-encoded e só é decodificado depois de casar, então /busca/caf%C3%A9 preenche req.params com café, enquanto uma sequência quebrada como %ZZ derruba o decodeURIComponent com URIError em vez de devolver 404. O Express, por padrão, ignora maiúsculas e trata /a e /a/ como a mesma rota, e os dois interruptores acima reproduzem esse comportamento.

Perguntas frequentes

Serve para Fastify, Koa ou React Router?
A sintaxe de dois-pontos é a mesma nos três, e o resultado costuma bater nos casos simples. As diferenças aparecem nos extremos: o Fastify usa uma árvore de prefixos e prefere a rota mais específica em vez da primeira registrada, e o React Router pontua os segmentos antes de escolher. Nesses casos, use o teste para conferir a extração dos parâmetros e leia o bloco de ordem com ressalva.
Por que minha rota literal nunca executa?
Quase sempre porque um padrão com parâmetro foi registrado antes dela e casa a mesma URL. O Express percorre a pilha na ordem e para no primeiro acerto, sem avisar que existe outra rota compatível mais abaixo. A correção é mover as rotas literais como /users/me para cima das genéricas como /users/:id, ou restringir o parâmetro com /users/:id(\d+).
Quantos segmentos o curinga captura?
No fim do padrão, o asterisco captura tudo o que sobrou do caminho, barras incluídas: /files/* aplicado a /files/docs/nota.txt devolve docs/nota.txt em um valor só. No meio do padrão ele vale por um segmento apenas, então /a/*/b não casa /a/x/y/b. Quando precisar do caminho inteiro depois de um prefixo, deixe o curinga na última posição.

Ferramentas Relacionadas