A medida que tu aplicación acumule más y más variables de entorno, puede volverse inmanejable y es propenso a tener errores el no recordar sus nombres o escribirlos mal. A continuación verás como tipar variables.
Cómo hacer el tipado de variables de entorno
Seguriza tu lista de variables de entorno de manera que evites errores que son difíciles de visualizar. Veamos cómo puedes tipar tus variables.
1. Archivo de tipado de variables
Crea un archivo al que denominaremos config.ts que contendrá el tipado de tu aplicación con ayuda de la dependencia @nestjs/config.
Importa registerAs desde @nestjs/config que servirá para crear el tipado de datos. Crea un objeto con la estructura de datos que necesita tu aplicación. Este objeto contiene los valores de las variables de entorno tomados con el objeto global de NodeJS, process.
2. Importación del tipado de datos
Importa el nuevo archivo de configuración en el módulo de tu proyecto de la siguiente manera para que este sea reconocido.
Es momento de utilizar este objeto que genera una interfaz entre nuestra aplicación y las variables de entorno para no confundir el nombre de cada variable.
import{Controller,Inject}from'@nestjs/common';import{ConfigType}from'@nestjs/config';importconfigfrom'./config';@Controller()exportclassAppController{constructor(@Inject(config.KEY)private configService:ConfigType<typeof config>){}getEnvs():string{const apiKey =this.configService.apiKey;const name =this.configService.database.name;return`Envs: ${apiKey}${name}`;}}
Observa la configuración necesaria para inyectar y tipar tus variables de entorno. Ahora ya no tendrás que preocuparte por posibles errores al invocar a una de estas variables y evitar dolores de cabeza debugueando estos errores.
Tipar nuestro archivo de configuración le dará el poder a typescript de ayudarnos a evitar errores triviales como escribir mal el nombre de una variable o no definir una variable en los archivos .env
Tipando el archivo de configuración
Para tipar el archivo de configuración debemos hacerlo con ayuda de la funcion registerAs incluida en el paquete de '@nestjs/config'
Estoy un poco frustrado, tengo una duda, como puedo hacer para configurar las variables de entorno sin tipado, y además realmente de forma global, es decir, poder usarlas sin necesidad de inyección?, por que hacer eso para variables de entorno honestamente me parece algo absurdo
Hola!
Dos cosas que pienso te pueden aportar:
Tiene mucho sentido ocupar inyeccion porque es uno de los puntos fuertes de Nestjs. Casi todo va inyectado y conservar esa forma de hacer las cosas permite escalar el backend y que el programador que viene detras no la pase tan mal entiendo (Trabajo en un backend que tiene una parte hecha en Nestjs)
En el caso que te menciono, tiene sentido inyectar las variables de entorno porque facilita emplear diferentes variables de entorno dependiendo del ambiente donde haces deploy. Por ejemplo, tengo de 3 a 4 ambientes para pasar de development a prod. Luego, tengo de 4 a 8 configuraciones de ambiente diferente. Al usar la inyeccion, puedo configurar el trigger (GCP en este caso) y con ello el deploy es mas agil (Considera que ciertas partes del codigo a veces no se pueden probar en local y no te queda otra que hacerlo en uno de los ambientes. Y estar cambiando las variables de entorno cada vez se vuelve tedioso)
En el caso que te hablo, las variables no van tipadas (Al parecer no alcanzaron a hacerlo, llegue despues). En ese caso, simplemente escribes las funciones getter en el sevicio de config y, asu vez, le configuras una carpeta con tus archivos .env. Con ello inyectas el servicio y te traes la variable de entorno que necesites (He visto que esa variable queda global en los archivos que se necesitan y asi no andas con la "mochila" de variables para todas partes)
Espero te sirva!
Saludos c:
Para este caso prefiero usar enums para evitar los magic strings, me parece mucho más simple y rápido de configurar
Aún no entiendo para qué sirve @Inject, tenía entendido que es para agregar providers pero no sé por qué acepta "config.KEY" como parámetro, ¿alguien que me explique, por favor?
@Inject() es un mecanismo manual para hacerle saber a NestJS que se debe inyectar un parámetro sobre todos valores primitivos como un string, number etc y acepta el config.key porque al crear un registerAs crea una key que es string.
Como observación leyendo la documentación, se puede inferir los tipos (types) usando una propiedad de ConfigService, tiene dos genéricos opcionales (argumentos de tipo).
El primero de ellos ayuda a prevenir el acceso a una propiedad de configuración que no existe.