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:
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/:
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.