Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Configuração e Variáveis de Ambiente

De onde o backend lê a URL do banco de dados e a porta HTTP? Colocar essas informações diretamente no código é ruim por dois motivos: qualquer mudança exige editar e redeployar o código, e credenciais ficam expostas no repositório.

A solução padrão é usar variáveis de ambiente. O código lê os valores de process.env, e cada máquina (o laptop do desenvolvedor, o servidor de produção) define seus próprios valores.

Crie o arquivo backend/src/config.ts:

Arquivo: backend/src/config.ts
export interface AppConfig {
  port: number;
  databaseUrl: string;
}

export function loadConfig(): AppConfig {
  const databaseUrl = process.env.DATABASE_URL;

  if (!databaseUrl) {
    console.error("Erro: DATABASE_URL não está definida.");
    process.exit(1);
  }

  return {
    port: parseInt(process.env.PORT ?? "3000", 10),
    databaseUrl,
  };
}

Código 5-6: Carregamento e validação da configuração.

A validação acontece no momento em que o servidor inicia. Se DATABASE_URL não estiver definida, o processo para imediatamente com uma mensagem clara. Descobrir que faltou uma variável de ambiente só quando a primeira requisição chega e o banco recusa a conexão é uma experiência bem pior.

A porta HTTP tem um valor padrão (3000), mas DATABASE_URL não tem — uma URL de banco errada é pior do que nenhuma URL, porque o servidor conectaria num banco que não é o certo.

Para facilitar o desenvolvimento, crie um arquivo .env na raiz do backend/:

Arquivo: backend/.env
DATABASE_URL=postgres://localhost:5432/tamojunto
PORT=3000

Código 5-7: Variáveis de ambiente para desenvolvimento local.

Essa URL não tem senha, e isso costuma gerar dúvida. A forma completa de uma URL de conexão do PostgreSQL é postgres://usuario:senha@host:porta/banco. Na sua máquina, o PostgreSQL vem configurado para confiar em conexões locais do seu próprio usuário do sistema operacional, então usuario, senha e @ podem ser omitidos: conectar em localhost já basta como prova de identidade. É por isso que o psql postgres://localhost:5432/tamojunto das migrations funcionou sem pedir nada.

Em produção o cenário é outro. O banco roda numa máquina separada, exposto na rede, e aceitar qualquer conexão sem autenticação seria um convite. Lá a DATABASE_URL carrega usuário e senha reais, algo como postgres://tamojunto_app:kR7$m02...@db.internal:5432/tamojunto. Essa é exatamente a credencial que não pode vazar.

Adicione .env ao .gitignore. O arquivo contém configuração específica de cada máquina e, em produção, a senha do banco. Cada desenvolvedor tem o seu, e nenhum deles vai parar no repositório.

Para que o Node.js carregue o .env automaticamente, chamamos import "dotenv/config" no ponto de entrada da aplicação. Veremos isso no app.ts a seguir.