Como Corrigir o Esquecimento de Validação de Variáveis de Ambiente pela IA
Agentes de IA leem valores de process.env diretamente sem validação, causando bugs silenciosos de undefined e erros de inicialização ausentes quando variáveis de ambiente estão faltando.
O agente acessa process.env.SOME_KEY diretamente, então quando a variável está ausente, o aplicativo inicia silenciosamente quebrado — sem falha, sem aviso, apenas undefined fluindo pela lógica de negócios.
O sintoma
Leituras brutas de process.env espalhadas pela base de código sem esquema, sem segurança de tipo e sem asserção de inicialização.
// lib/stripe.ts — WRONGimport Stripe from "stripe";
export const stripe = new Stripe(process.env.STRIPE_SECRET_KEY, { apiVersion: "2024-06-20",});// If STRIPE_SECRET_KEY is undefined, Stripe SDK accepts it and every// charge silently fails at runtime instead of at startup.Por que acontece
O agente otimiza para brevidade e para alcançar código funcional rapidamente. A validação de variáveis de ambiente é um boilerplate que não aparece na maioria dos exemplos de treinamento, então o modelo a ignora e vai direto para a integração.
Como identificar
process.env.FOOusado sem uma asserção não nula ou verificação de fallback.- Nenhum arquivo de validação
env.ts/env.mjsno projeto. - O tipo TypeScript de um valor de ambiente é
string | undefinedno local da chamada. - O aplicativo inicia sem erro mesmo quando
.env.localestá vazio.
Como corrigir
Valide todas as variáveis de ambiente necessárias na inicialização usando um esquema Zod para que o processo falhe com uma mensagem clara antes de servir uma única requisição.
// lib/env.ts — CORRECTimport { z } from "zod";
const envSchema = z.object({ STRIPE_SECRET_KEY: z.string().min(1), DATABASE_URL: z.string().url(), NEXTAUTH_SECRET: z.string().min(32), NODE_ENV: z.enum(["development", "production", "test"]).default("development"),});
export const env = envSchema.parse(process.env);// ^^^^^ throws at startup if any var is missing// lib/stripe.ts — CORRECT (import validated env)import Stripe from "stripe";import { env } from "@/lib/env";
export const stripe = new Stripe(env.STRIPE_SECRET_KEY, { apiVersion: "2024-06-20",});[ ] Create lib/env.ts with a Zod schema covering every required variable[ ] Import env from lib/env everywhere — never use process.env directly[ ] Add lib/env.ts to the module graph so it runs at server startup (import in next.config.ts)[ ] Document all variables in .env.example with placeholder values[ ] Use z.string().url() / z.string().min(n) for format constraints, not just presencePrompt de Correção
Every raw process.env access in this file is unvalidated. Create a lib/env.tsmodule that parses and validates all required environment variables with Zod atstartup. Replace every process.env.FOO reference in the codebase with thetyped env.FOO import. Add a .env.example file listing every variable with aplaceholder value and comment.Teste
# Find any remaining raw process.env reads outside of lib/env.tsgrep -rn "process\.env\." --include="*.ts" --include="*.tsx" . \ | grep -v "lib/env.ts" \ | grep -v "next.config" \ | grep -v "node_modules" \ && echo "FAIL: raw process.env reads found" || echo "OK"