Gestión de Variables de Entorno en Aplicaciones Node.js

Clase 6 de 22Curso de NestJS: Autenticación con Passport y JWT

Resumen

¿Qué son las variables de ambiente y cómo se usan en aplicaciones?

Las variables de ambiente son herramientas esenciales en la configuración de aplicaciones modernas. Estas permiten manejar configuraciones de manera flexible, dependiendo del entorno en el que se está ejecutando la aplicación, ya sea desarrollo, producción o staging. Al definir estas variables, garantizamos que nuestra aplicación se comporta correctamente en cada contexto específico.

¿Cómo integramos variables de ambiente en nuestro proyecto?

La integración de variables de ambiente en un proyecto requiere unos pasos específicos. Primero, decidimos qué variables son necesarias para cada entorno. En el caso de las credenciales de API, como visto en el ejemplo, se utilizan para autenticar solicitudes de forma segura.

  1. Definición de variables: En el proyecto, por ejemplo, se definen variables como APK y se asignan valores dependiendo del entorno. Para desarrollo, podemos asignar ABC.23, y para staging, ZXC.123.

  2. Lectura en el código: Usamos inyecciones de dependencia para acceder a las configuraciones desde el sistema. Se importan herramientas de configuración para gestionar estas variables de manera modular.

  3. Validación de variables: Las aplicaciones deben ser robustas frente a errores de validación. En nuestro código, cambiamos la validación de APK a un string que acepta combinaciones de letras y números, garantizando compatibilidad con las claves API reales.

import { ConfigModule, ConfigService } from '@nestjs/config';

@Injectable()
export class MyService {
  constructor(private configService: ConfigService) {}

  getApiKey() {
    return this.configService.get<string>('APK');
  }
}

¿Cómo se prueban estas configuraciones?

Una vez definida e implementada la gestión de variables de ambiente, es crucial probarla. Para ello, cambiamos entre diferentes entornos y observamos el comportamiento de la aplicación:

  • Entorno de desarrollo: Al ejecutar el entorno de desarrollo, aseguramos que las variables como ABC.123 son válidas para los endpoints protegidos.
  • Entorno de staging: Cambiamos a este entorno para verificar que las variables como ZXC.123 funcionen correctamente, y cualquier otro valor resulte en una respuesta de error.
# Ejecutar en entorno de desarrollo
NODE_ENV=development node app.js

# Ejecutar en entorno de staging
NODE_ENV=staging node app.js

¿Qué pasa si hay un error de validación?

Si una variable de ambiente no pasa la validación, se debe revisar el esquema. En el caso mencionado, si la APK aceptara solo números pero necesita letras, simplemente ajustamos esa validación en el módulo principal de la aplicación para aceptar strings más flexibles:

{
  APK: Joi.string().required(),
}

¿Por qué es importante esta configuración?

Incorporar variables de ambiente no solo mejora la seguridad al evitar la exposición de credenciales en el código fuente, sino que también facilita la gestión de configuraciones al permitir cambios sin necesidad de alterar el código base. Este enfoque modular es crucial para aplicaciones escalables y mantenibles en distintos entornos.