Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ao desenvolver APIs com Express.js, uma necessidade comum é fornecer informações completas de URI para os consumidores, incluindo protocolo, hostname e porta. No entanto, o objeto request padrão do Express não expõe diretamente esses componentes de forma consolidada, especialmente em ambientes com múltiplas interfaces de rede, onde o hostname pode variar a cada requisição.
O problema central é a ausência de um atributo que reúna todas essas informações de URI no objeto request, de forma consistente e acessível a todos os handlers. A construção manual dessa URI em cada endpoint, concatenando req.protocol, req.get('host') e outros componentes, é prática, mas pode gerar redundância e risco de inconsistências. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Outro ponto importante é que o hostname pode variar dependendo da interface de rede utilizada, principalmente em servidores com múltiplas IPs ou configurações de balanceamento de carga. Assim, uma abordagem que funcione em uma requisição não necessariamente será válida na próxima, reforçando a necessidade de uma solução dinâmica. 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.
A solução mais efetiva é a implementação de um middleware que intercepta todas as requisições e adiciona um atributo personalizado ao objeto request, contendo a URI completa. Essa middleware deve ser inserida antes de qualquer rota que precise dessas informações.
app.use((req, res, next) => {
const protocol = req.protocol. const host = req.get('host'). // inclui hostname e porta se presente
req.fullUri = `${protocol}://${host}${req.originalUrl}`. next(). }).
Dessa forma, toda requisição passa a ter um atributo fullUri, que é atualizado automaticamente com base na requisição atual. Utilizar req.get('host') garante que o valor do host seja obtido de forma confiável, incluindo a porta se ela estiver presente. 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. 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.
X-Forwarded-Proto e X-Forwarded-Host, para garantir que os valores reflitam a URL pública.Suponha que você queira gerar links para recursos relacionados na sua API. Com o middleware acima, pode fazer algo assim:
app.get('/usuarios/:id', (req, res) => {
const userResourceLink = `${req.fullUri}/dados`. res.json({ link: userResourceLink }). }). Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Dessa forma, o link gerado será sempre consistente com a requisição atual, independente da interface de rede ou configurações do ambiente. 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. O valor apa rece 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.
Implementar um middleware para construir dinamicamente a URI completa é uma prática eficiente e escalável, que evita redundância e garante consistência. Em ambientes de produção, é fundamental ajustar a configuração de proxy para que os cabeçalhos de forwarding sejam corretamente utilizados, assegurando que a URI refletida seja a pública e acessível ao consumidor. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Se a sua aplicação exige manipulação avançada de URLs, considere também o uso de bibliotecas específicas para gerenciamento de URLs, que podem facilitar a criação e validação de links em diferentes contextos. 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. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Ao seguir esses passos, a sua API ficará mais robusta e amigável ao consumidor, facilitando integrações e garantindo maior controle sobre a geração de URIs dinâmicas. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. 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. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Sim, no meu time a gente teve que configurar o trust proxy do Express e validar os cabeçalhos X-Forwarded-*. Sem isso, a URI fica incompleta ou incorreta.
Olha, acho que o ponto mais difícil é cuidar para que esses valores estejam corretos em ambientes com proxy. Já passou por isso?
Boa dica, mas cuidado ao expor esses links externos. Dependendo do ambiente, pode ser melhor usar variáveis de configuração ou valores fixos em certos casos.
E pra ambientes serverless ou cloud, acho que essas informações podem variar mesmo, então essa abordagem dinâmica ajuda bastante mesmo.