Configurar de manera segura y eficiente las variables de entorno es esencial para cualquier aplicación moderna. Con un enfoque directo y claro, aquí aprenderás cómo manejar variables de entorno en NestJS, aprovechar su configuración global y evitar riesgos de seguridad en tus proyectos.
¿Cómo afectan los diferentes ambientes a la configuración de variables de entorno?
Cada ambiente tiene requisitos distintos. El entorno de producción usa llaves de acceso reales y completas. El entorno de desarrollo emplea accesos limitados y opciones como debug, lo que reduce riesgos y facilita pruebas controladas. Es importante nunca compartir variables sensibles en el código: cada ambiente requiere su propio archivo de configuración.
¿Qué pasos seguir para configurar variables de entorno en NestJS?
Instala el paquete nestjs/config con el gestor de paquetes.
Declara el uso de ConfigModule como global en tu módulo principal (app.module.ts) para que cualquier componente pueda acceder a las variables sin restricciones especiales.
Utiliza archivos como .env para definir las variables, y .gitignore para asegurarte de que no sean rastreadas en el repositorio por motivos de seguridad.
Incluye también un archivo .env.example en el repositorio para que cada desarrollador sepa qué variables necesita definir en su entorno local.
Recuerda: los archivos .env y .env.local nunca deben compartirse. Solo el archivo de ejemplo sirve de guía.
¿Cómo acceder y tipar correctamente las variables de entorno?
Inyecta ConfigService en tus controladores o servicios usando la inyección de dependencias, igual que harías con cualquier servicio personalizado.
Obtén las variables con el método get del servicio:
const valor = this.configService.get<string>('NOMBRE_VARIABLE');
Usa el tipado adecuado, como , para decirle a TypeScript el tipo esperado y evitar problemas en tiempo de ejecución.
Implementa un archivo modelo (por ejemplo, env.model.ts) con una interfaz que describa los nombres y tipos de las variables. Así, si escribes mal el nombre de una variable, obtendrás una alerta de inmediato.
Activa la inferencia de tipos con la bandera isGlobal e infer: true al configurar el módulo. Así toda la app hereda esa validación.
¿Cuáles son las mejores prácticas al manejar archivos .env y variables sensibles?
Nunca incluyas archivos .env con valores reales en el repositorio.
Sube solo el archivo .env.example con los nombres de las variables, pero deja los valores en blanco.
Define las variables de entorno por privado y asigna los valores necesarios solo en desarrollo o producción.
Si un valor es requerido y no está definido, el sistema regresa undefined, así que valida siempre la existencia antes de usar la variable.
Si necesitas agregar otra variable, adáptala en el modelo de tu archivo env.model.ts y en el archivo example.
¿Cómo aprovechar la inyección de dependencias y el patrón singleton?
Puedes inyectar varios servicios en los controladores; cada servicio se comparte en una sola instancia (singleton), facilitando el acceso global y coherente a los datos.
Usa endpoints RESTful claros: nómbralos según lo que representan y devuelve, evitando endpoints genéricos como /mytest que no siguen las convenciones REST.
El acceso centralizado a variables de entorno permite usarlas en cualquier componente, controlador o servicio.
¿Tienes más dudas sobre cómo integrar variables de entorno en tus proyectos con NestJS? ¡Cuéntanos tu experiencia y comparte cualquier truco que te funcione!
Aunque usar interfaces con ConfigService<EnvModel> ayuda a tener tipado, autocompletado y valores por defecto, esto no valida que la variable exista realmente en tiempo de ejecución.
Para proteger la aplicación de configuraciones incompletas o incorrectas, es mejor combinarlo con validación usando Joi, ya que NestJS no permitirá que la app arranque si falta una variable requerida.
En caso de que haga falta una variable que se declaró como requerida al momento de ejecutar el proyecto saldrá algo como:
Interfaces → ayudan al desarrollo (tipos, autocompletado, valores defaults (para variables no obligatorias)).
Joi → protege la ejecución real (valida, exige y evita fallos en producción).
no entendi muy bien para que exponer el servicio de Users con otro nombre de endpoint si no cumple con la normativa, cual seria el caso de uso real en produccion o que beneficio tendria hacerlo... no le vi sentido, si alguien tiene un ejemplo mas claro se lo agradecería mucho
El ejemplo puntual no sirve para nada. Lo unico que quiso mostrar el profesor es que si es necesario en algun momento podrias tener mas de una service inyectado en un controller
🔐 GESTIÓN DE VARIABLES DE ENTORNO EN NESTJS
> Seguridad Primero: Nunca subas tus secretos al repositorio. Usa ambientes separados para Desarrollo y Producción.
📦 1. INSTALACIÓN Y SETUP INICIAL
NestJS utiliza un paquete oficial que envuelve a dotenv para darnos superpoderes.
Comando:npm i @nestjs/config
Configuración Global (app.module.ts): Al marcarlo como isGlobal: true, no necesitas importarlo en otros módulos; el ConfigService estará disponible en toda la app.
TypeScript
import{ConfigModule}from'@nestjs/config';@Module({imports:[ConfigModule.forRoot({isGlobal:true,// 🌍 Acceso universalenvFilePath:'.env',// Archivo por defecto}),],})exportclassAppModule{}
🛡️ 2. LA REGLA DE ORO DEL .GITIGNORE
Para evitar fugas de información, tu estructura de archivos debe ser:
📄 .env: (PROHIBIDO SUBIR) Contiene tus API Keys y Passwords reales.
📄 .env.example: (SÍ SE SUBE) Guía para otros devs con los nombres de las variables pero valores vacíos.
📄 .gitignore: Debe incluir estrictamente la línea .env.
💉 3. USO E INYECCIÓN EN SERVICIOS
Para usar una variable, inyectas el ConfigService en el constructor, igual que cualquier otro servicio.
Ejemplo de uso:
TypeScript
constructor(privateconfigService:ConfigService){}getDatabaseHost(){// Usamos <string> para decirle a TS qué tipo de dato esperamosreturnthis.configService.get<string>('DATABASE_HOST');}
🏷️ 4. TIPADO FUERTE (The Pro Way)
No confíes en recordar los nombres de las variables. Crea un Modelo de Entorno para tener autocompletado y evitar errores de dedo.