Conceptos Básicos de Configuración
8 ejemplos para empezar con la Configuración para backends de Node.js: 6 básicos y 2 intermedios.
Busca en todas las páginas de la documentación
8 ejemplos para empezar con la Configuración para backends de Node.js: 6 básicos y 2 intermedios.
npm install zod
npm install -D typescript@5.6 tsx dotenvNode 24.18.0 lee process.env en tiempo de ejecución. Los valores de producción provienen de la plataforma (k8s, ECS, Fly.io), no de archivos en la imagen.
Todos los ajustes fluyen a través de una única exportación config.
// src/config.ts
import { z } from "zod";
const envSchema = z.object({
NODE_ENV: z.enum(["development", "test", "production"]).default("development"),
PORT: z.coerce.number().default(3000),
DATABASE_URL: z.string().url(),
LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"),
});
export const config = envSchema.parse(process.env);parse lanza un error al iniciar si falta DATABASE_URL: falla rápido, no en la primera solicitudprocess.env directamenteprocess.env antes de importar config o usan importación dinámica después de la configuraciónRelacionado: Validación de Zod y env-schema - ajustes tipados
Los secretos rotan con más frecuencia y necesitan ACLs más estrictas.
const envSchema = z.object({
PORT: z.coerce.number().default(3000),
DATABASE_URL: z.string().url(), // secreto - cadena de conexión
STRIPE_SECRET_KEY: z.string().min(1), // secreto - clave API
PUBLIC_WEB_URL: z.string().url(), // no secreto - seguro en los logs
});DATABASE_URL o claves API; redáctalos en los serializadores de PinoRelacionado: Administradores de Secretos - obtener al iniciar
.env Local Solo para Desarrollo# .env.example (confirmado)
PORT=3000
DATABASE_URL=postgres://localhost:5432/app_dev
LOG_LEVEL=debug// src/bootstrap-env.ts - solo importado desde la entrada de desarrollo
import { config as loadEnv } from "dotenv";
if (process.env.NODE_ENV !== "production") {
loadEnv();
}.env.example, nunca .envdotenv es una devDependency cuando es posibleRelacionado: dotenv vs Inyección de Plataforma - local vs producción
Evita los puertos tipados como cadenas en app.listen.
import { config } from "./config";
const app = express();
app.listen(config.PORT, () => {
console.log(`escuchando en ${config.PORT} env=${config.NODE_ENV}`);
});z.coerce.number() acepta "3000" de las variables de entorno de cadena de k8sconfig.NODE_ENV, no en process.env.NODE_ENV dispersostest usa una URL de base de datos en memoria de los secretos de CIBanderas booleanas del entorno para interruptores de apagado simples.
const envSchema = z.object({
FEATURE_NEW_CHECKOUT: z
.enum(["true", "false"])
.default("false")
.transform((v) => v === "true"),
});.env.example con el propietario y la fecha de eliminaciónRelacionado: Banderas de Funciones y Alternadores en Tiempo de Ejecución - banderas dinámicas
El ajuste operacional pertenece a la configuración, no a números mágicos codificados.
const envSchema = z.object({
HTTP_TIMEOUT_MS: z.coerce.number().default(30_000),
DB_POOL_MAX: z.coerce.number().default(10),
});let cached: AppConfig | undefined;
export function loadConfig(env = process.env): AppConfig {
if (!cached) cached = envSchema.parse(env);
return cached;
}
export function resetConfigForTests() {
cached = undefined;
}resetConfigForTests() entre casosloadConfig() una vez al iniciar.refineconst envSchema = z
.object({
REDIS_URL: z.string().url().optional(),
CACHE_ENABLED: z.enum(["true", "false"]).transform((v) => v === "true"),
})
.refine((e) => !e.CACHE_ENABLED || e.REDIS_URL, {
message: "REDIS_URL requerido cuando CACHE_ENABLED=true",
});Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS Activo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026