P PasteCode
Failure

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.

CursorClaude CodeCodexWindsurf Next.jsTypeScriptCloudflare
.md .json Atualizado 8 de jun. de 2026

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 — WRONG
import 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.FOO usado sem uma asserção não nula ou verificação de fallback.
  • Nenhum arquivo de validação env.ts / env.mjs no projeto.
  • O tipo TypeScript de um valor de ambiente é string | undefined no local da chamada.
  • O aplicativo inicia sem erro mesmo quando .env.local está 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 — CORRECT
import { 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 presence

Prompt de Correção

Fix Prompt
Every raw process.env access in this file is unvalidated. Create a lib/env.ts
module that parses and validates all required environment variables with Zod at
startup. Replace every process.env.FOO reference in the codebase with the
typed env.FOO import. Add a .env.example file listing every variable with a
placeholder value and comment.

Teste

Terminal window
# Find any remaining raw process.env reads outside of lib/env.ts
grep -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"