Comment corriger l'oubli de validation des variables d'environnement par l'IA
Les agents IA lisent les valeurs process.env directement sans validation, ce qui provoque des bugs silencieux d'undefined et des erreurs de démarrage manquantes lorsque les variables d'environnement sont absentes.
L’agent accède directement à process.env.SOME_KEY, donc lorsque la variable est absente, l’application démarre silencieusement cassée — pas de plantage, pas d’avertissement, juste undefined qui circule dans la logique métier.
Le symptôme
Des lectures brutes de process.env dispersées dans la base de code sans schéma, sans sécurité de type et sans assertion au démarrage.
// 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.Pourquoi cela se produit
L’agent optimise la brièveté et l’obtention rapide d’un code fonctionnel. La validation des variables d’environnement est un code passe-partout qui n’apparaît pas dans la plupart des exemples d’entraînement, donc le modèle l’ignore et va directement à l’intégration.
Comment le repérer
process.env.FOOutilisé sans assertion non-nulle ou vérification de repli.- Aucun fichier de validation
env.ts/env.mjsdans le projet. - Le type TypeScript d’une valeur d’env est
string | undefinedau site d’appel. - L’application démarre sans erreur même lorsque
.env.localest vide.
Comment le corriger
Validez toutes les variables d’env requises au démarrage à l’aide d’un schéma Zod afin que le processus plante avec un message clair avant de servir une seule requête.
// 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 presenceInvite de correction
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.Test
# 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"